命名管道的创建:
int mkfifo(const char*pathname,mode_t mode);
pathname创建管道的名字,mode给的权限,权限依然收到umask影响
mkfifo创建命名管道文件,文件的大小永远为0,表示不占用磁盘的大小,它是用一个名字代表内核上的一块缓存,没有亲缘关系的进程可以通过名字拿到内核上的这块缓存,值得注意的是要写的时候读写管道必须同时打开
对于管道文件 一次write的大小不要超过PIPE_BUF的大小。如果超过可能就不是原子操作了,因为在执行期间会让其他的进程执行。
具体用法:
两个进程间用命名管道进行通信,其中一个进程负责不断的写入,这里我们循环写的是a~z 一共26个字母
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4 #include<fcntl.h>
5 int main()
6 {
7 int fd=open("my.py",O_WRONLY);
8 char buf[2]={'a'};
9 int i=0;
10 while(1)
11 {
12 write(fd,buf,1);
13 printf("write finish: %c\n",buf[0]);
14 i++;
15 buf[0]='a'+i%25;
16 }
17 close(fd);
18 }
~
另一个进程不断的读取
1 #include<stdio.h>
2 #include<fcntl.h>
3 #include<unistd.h>
4 int main()
5 {
6 int fd;
7 fd=open("my.py",O_RDONLY);
8 char buf[2];
9 while(1)
10 {
11 read(fd,buf,1);
12 printf("finsh read:%c\n",buf[0]);
13 sleep(1);
14 }
15 close(fd);
16 }
当我们仅仅运行写时,我们发现程序一直在等待,当我们再执行读时,我们的代码才会正常执行,这恰恰体现了命名管道要求读写端必须同时打开的要求。
运行结果: