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

三、测试图