之前说过管道的应用,在进程间通讯的时候,还有一种常用的方式,就是创建FIFO文件用于通讯
FIFO文件相对于管道的区别就是FIFO文件能被与创建进程无关的其他进程进行通信,但只限于本机上的进程(管道也是)
创建FIFO文件之需要调用mkfifo函数即可
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char * pathname,mode_t mode);
//pathname是创建的路径名
//mode是创建后该FIFO文件的权限
//注意该函数默认有O_CREATE | O_EXCL,也就是说,要么创建新的FIFO文件,要么返回错误
//至于mode的取值,在前面的《Liinux系统编程学习之文件和目录操作》中有说过,这里再复制一下好看一些
* S_IRUSR 用户-读
* S_IWUSR 用户-写
* S_IXUSR 用户-执行
* S_IRGRP 组-读
* S_IWGRP 组-写
* S_IXGRP 组-执行
* S_IROTH 其他-读
* S_IWOTH 其他-写
* S_IXOTH 其他-执行
* S_ISUID 执行时设置用户ID
* S_ISGID 执行时设置组ID
* S_ISVTX 保存正文(粘住位,如/tmp里面,可以修改自己文件,不可以修改别人文件)
* S_IRWXU 用户(所有者)读,写和执行
* S_IRWXG 组读,写和执行
* S_IRWXO 其他读,写和执行
下面演示一下如何使用FIFO文件:
我要演示的效果是,一个程序创建一个fifo文件,然后一个程序使用该fifo进行写,一个用该fifi进行读
创建的代码如下:
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#define PATHNAME "./fifofile"
int main()
{
int res = mkfifo(PATHNAME,S_IRUSR | S_IWUSR); //创建FIFO文件
if (res < 0) //错误处理
printf("fifo file exist!\n");
return 0;
}
写fifo文件的代码如下:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#define PATHNAME "./fifofile"
int main()
{
int writefifo;
writefifo = open(PATHNAME,O_WRONLY,0); //打开刚刚创建的FIFO文件
char str[1024];
char buf[1024];
while (scanf("%s",str)!=EOF) //从终端输入信息
{
snprintf(buf,1024,"%s,write by process %d",str,getpid());
write(writefifo,buf,strlen(buf)+1); //写入到fifo文件中去
}
close(writefifo);
return 0;
}
读fifo的代码如下:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#define PATHNAME "./fifofile"
int main()
{
int readfifo;
readfifo = open(PATHNAME,O_RDONLY,0); //打开FIFO文件进行读
char str[1024];
while (read(readfifo,str,1024) > 0) //从FIFO文件中读取信息
{
printf("Process %d read:\n%s\n",getpid(),str); //打印出来
}
close(readfifo);
return 0;
}
写入端截图:
读取端截图:
另外i,FIFO文件可以创建之后不关闭,直到调用unlink函数或者用命令汗输入rm命令,这对于重复利用很有用处