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()创建,具体见下一篇博客。