关于命名管道的小案例

本文介绍了命名管道的概念,包括其创建方式(mkfifo)和作用。命名管道提供了一个让两个无关进程间通信的机制,通过共享内核缓冲区。在Linux环境下,可以通过两个终端分别进行读写操作来观察其工作过程。文章还提到了一个包含三个源文件的实战案例,分别用于创建管道、写入数据和读取数据。此外,文章指出匿名管道是用于有亲缘关系的进程间通信,与命名管道有所不同。
摘要由CSDN通过智能技术生成

1. 命名管道

创建命名管道创建方式:

函数:mkfifo(“my.p”,0644)

命令:mkfifo my.p

命名管道作用:在内核中建一块缓冲区,并命名,使得2个没有亲缘关系的进程能够实现通信,通过open这块缓冲区往里面写东西,读东西。一旦这2个进程能够找到了这块共有的缓冲区,可以删除my.p这个文件,删除之后并不影响2个进程的通信。

需要注意的是:当只有进程往这块缓存写东西时(即没有读进程),那么写进程就处于阻塞状态,反之也一样;因此,命名管道必须是2个进程一个写一个读,在Linux下,我们可以使用两个终端来观测。

2. 案例。本案例有3个源文件分别是:(1)创建命名管道(2)写内容到管道里(3)从管道读取东西。

(1)创建命名管道:

1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 
  5 int main()
  6 {
  7     mkfifo("my.p",0644);
  8     return 0;
  9 }

(2)写管道

1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 #include <fcntl.h>
  5 int main()
  6 {
  7     int fd=open("my.p",O_WRONLY);
  8     if(fd==-1)
  9     {
 10         perror("open failure");
 11         exit(1);
 12     }
 13 
 14     int i=0;
 15     while(1)
 16     {
 17         write(fd,&i,sizeof(i));
 18         printf("write %d is ok\n",i);
 19         i++;
 20         sleep(1);
 21     }
 22     return 0;
 23 }

(3)读管道

 2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <unistd.h>
  5 #include <fcntl.h>
  6 
  7 int main()
  8 {
  9     int fd=open("my.p",O_RDONLY);
 10     if(fd==-1)
 11     {
 12         perror("open failure");
 13         exit(1);
 14     }
 15 
 16     int i=0;
 17     while(1)
 18     {
 19         read(fd,&i,sizeof(i));
 20         printf("%d\n",i);
 21         sleep(1);
 22     }
 23     return 0;
 24 }

另外,关于匿名管道是用于有亲缘关系的管道实现通信的,用pipe()创建,具体见下一篇博客。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值