进程间通信(FIFO管道)

博客介绍了Linux中FIFO(命名管道)的概念及其作为进程间通信(IPC)手段的使用。通过mkfifo创建FIFO文件,然后使用open、write和read函数实现数据的读写。示例代码展示了如何在一个进程中创建FIFO并写入数据,在另一个进程中读取这些数据。FIFO文件在磁盘上没有实际数据,仅作为内核中通信通道的标识。
摘要由CSDN通过智能技术生成

        FIFO常被称为命名管道,以区分pipe,pipe只能用于“有血缘关系”的进程间通信。但通过FIFO,不相关的进程也能交换数据。

        FIFO是linux基础文件类型中的一种(文件类型为p,可通过ls -l查看文件类型),但FIFO文件在磁盘上没有数据块,文件大小为0,仅仅用来标识内核中一条通道。进程可以打开这个文件进行read/write,实际上是在读写内核缓冲区,这样就实现了进程间通信。

创建FIFO管道

进程间通信流程

  • 进程A
    • 创建一个fifo文件,使用mkfifo命令或者函数
    • 使用 open fifo文件,获得一个文件描述符fd
    • 写fifo文件--------write(fd,"xxx",...)
    • 关闭fifo文件 ----close(fd);
  • 进程B
    • 打开fifo文件,获得文件描述符fd
    • 读fifo文件---read(fd,buf,sizeof(buf));
    • 关闭fifo文件----close(fd)
        1 //fifo完成两个进程间通信的测试
        2 #include<stdio.h>
        3 #include<stdlib.h>
        4 #include<string.h>
        5 #include<unistd.h>
        6 #include<sys/stat.h>
        7 #include<fcntl.h>
        8 #include<sys/types.h>
        9 
       10 int main()
       11 {
       12     //创建fifo文件
       13     int ret = mkfifo("./myfifo",0777);
       14     if(ret<0)
       15     {
       16         perror("mkfifo error");
       17         return -1;
       18     }
       19 
       20     //打开文件
       21     int fd =  open("./myfifo",O_RDWR);
       22     if(fd<0){
       23         perror("open error");
       24         return -1;
       25     }
       26 
       27     //写fifo文件
       28     write(fd,"hello world",strlen("hello world"));
       29 
       30     //关闭文件
       31     //close(fd);
       32 
       33 //  getchar();
       34 
       35     return 0;
       36 
       37 
       38 }
      ~       
        1 //fifo完成两个进程间通信的测试
        2 #include<stdio.h>
        3 #include<stdlib.h>
        4 #include<string.h>
        5 #include<unistd.h>
        6 #include<sys/stat.h>
        7 #include<fcntl.h>
        8 #include<sys/types.h>
        9 
       10 int main()
       11 {
       12     //创建fifo文件
       13 #if 0
       14     int ret = mkfifo("./myfifo",0777);
       15     if(ret<0)
       16     {
       17         perror("mkfifo error");
       18         return -1;
       19     }
       20 #endif
       21     //打开文件
       22     int fd =  open("./myfifo",O_RDWR);
       23     if(fd<0){
       24         perror("open error");
       25         return -1;
       26     }
       27 
       28     char buf[64];
       29     memset(buf,0x00,sizeof(buf));
       30     //写fifo文件
       31     int n=read(fd,buf,sizeof(buf));
       32     printf("n==[%d],buf==[%s]",n,buf);
       33     //关闭文件
       34     close(fd);
       35 
       36 
       37     return 0;
       38 
       39 
       40 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值