Linux系统编程学习之《FIFO文件的应用》

之前说过管道的应用,在进程间通讯的时候,还有一种常用的方式,就是创建FIFO文件用于通讯

FIFO文件相对于管道的区别就是FIFO文件能被与创建进程无关的其他进程进行通信,但只限于本机上的进程(管道也是)

创建FIFO文件之需要调用mkfifo函数即可

#include 
#include 
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 
#include 
#include 
#include 
#include 

#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 
#include 
#include 
#include 
#include 
#include 


#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 
#include 
#include 
#include 
#include 
#include 

#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;
}

写入端截图:

Linux系统编程学习之《FIFO文件的应用》_第1张图片


读取端截图:

Linux系统编程学习之《FIFO文件的应用》_第2张图片


另外i,FIFO文件可以创建之后不关闭,直到调用unlink函数或者用命令汗输入rm命令,这对于重复利用很有用处


你可能感兴趣的:(Unix/Linux系统编程)