C/C++使用FIFO实现非父子进程之间的通讯
一、概述
案例:编写两个进程,要求实现两个进程之间的通讯,A进程循环写数据,B进程循读取管道中的数据。
fifo简单介绍:使用fifo这个系统提供的Api函数可实现两个进程之间的相互通讯。其通讯原理是通过mkfifo函数创建一个fifo文件,进程A和进程B通过操作者fifo文件来完成双方的通信。由于进程之间通讯必须要经过操作系统内核,所以进程A和进程B操作fifo文件就相当于间接操作了内核。其中进程A操作fifo文件写入数据,进程B通过操作fifo文件将管道中的数据读取出来。
操作步骤:
进程A:
1.先检测myfifo文件是否存在,如果不存在就创建一个
2.打开myfifo文件
3.写入myfifo文件
4.关闭myfifo文件
进程B:
1.检测myfifo文件是否存在,如果存在就读取,不存在就创建
2.打开myfifo文件
3.读取myfifo文件
4.关闭myfifo文件
二、代码实例
1.写端:
//fifo完成两个非父子进程之间的通讯 #include#include #include #include #include #include #include int main() { //1.创建fifo文件 //检测fifo文件是否存在 int ret = access("./myfifo",F_OK); if(ret!=0){ ret = mkfifo("./myfifo",0777); if(ret<0){ perror("mkfifo error"); return -1; } } //打开文件 int fd = open("./myfifo",O_RDWR); if(fd<0){ perror("open error"); return -1; } //写fifo文件 int i=0; char buf[64]; while(1){ memset(buf,0x00,sizeof(buf)); sprintf(buf,"%d:%s",i,"hello world"); write(fd,buf,strlen(buf)); sleep(1); i++; } //关闭文件 close(fd); return 0; }
2.读端:
#include#include #include #include #include #include #include int main(){ //判断myfifo文件是否存在,如果不存在就创建 int ret = access("./myfifo",F_OK); if(ret!=0){ ret = mkfifo("./myfifo",0777); if(ret<0){ perror("mkfifo error"); return -1; } } //打开文件 int fd = open("./myfifo",O_RDWR); if(fd<0){ perror("open error"); return -1; } //读fifo文件 int n =0; char buf[64]; while(1){ memset(buf,0x00,sizeof(buf)); n = read(fd,buf,sizeof(buf)); printf("n==[%d],buf==[%s]\n",n,buf); } //关闭文件 close(fd); return 0; }
三、测试图