命名管道的理解与用法

命名管道的创建:

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 }

当我们仅仅运行写时,我们发现程序一直在等待,当我们再执行读时,我们的代码才会正常执行,这恰恰体现了命名管道要求读写端必须同时打开的要求。

运行结果:

猜你喜欢

转载自blog.csdn.net/enjoymyselflzz/article/details/81515154
今日推荐