进程通信——匿名管道

目录

1、Creat

2、Read&Write

3、Wait

4、Close


  • 管道是 SylixOS 进程间通信的一种方式。
  • 管道分为匿名管道 pipe 和命名管道 fifo
  • 管道有两个端口:读端和写端,并且只允许数据从写端流向读端,所以管道是一种流式设备。
  • 个人理解:可以将管道理解为是一种使用特殊结构读写的文件。
创建一个匿名管道使用 pipe 函数, pipe 函数的输出参数为两个文件描述符:一个为读端文件描述符,一个为写端文件描述符。
创建匿名管道后通常使用 posix_spawn 族或 spawn族函数创建一个子进程,由于子进程继承了父进程的文件描述符,所以子进程和父进程均能使用 read write 函数对匿名管道进行读和写操作,如下图所示。
匿名通道
匿名通道
关于上图做一点理解:虽然父进程和子进程局都可以通过读端、写端文件描述符对匿名通道进程操作,但在单个匿名管道内父子进程只能实现半双工( 数据只能从写端流向读端),要实现全双工可以创建使用两个匿名通道。

1、Creat

#include <unistd.h>
int pipe(int iFd[2]);
int pipe2(int iFd[2], int iFlag);

函数原型分析:

  • 以上函数成功时返回 0,失败时返回-1 并设置错误号;
  • 输出参数iFd用于记录匿名管道的两个文件描述符:iFd[0]为读端文件描述符,iFd[1]为写端文件描述符;
  • 参数 iFlag 是匿名管道的文件标志,可以使用 0 或以下的宏组合。

2、Read&Write

匿名管道的读写操作的实现依赖于pipe函数输出的两个文件描述符:读端文件描述符、写端文件描述符, 所以匿名管道的读和写操作可以使用标准的文件读写函数——read 和 write 函数。
关于 read 和 write 函数的实现可参考“SylixOS文件I/O函数”中的对应描述:https://blog.csdn.net/Liangren_/article/details/107818912

3、Wait

在匿名管道为空或满时,读或写匿名管道操作将被阻塞(除非使用 pipe2 函数创建匿名管道时参数 iFlag 指定了 O_NONBLOCK 选项),而等待一个匿名管道可读或可写,可以调用 select 函数,当 select 返回时,我们可以得知多少文件描述符就绪了,以及哪些文件描述符就绪了,使用这些就绪的文件描述符可以进行 read、write 等操作
关于select函数的实现讲解参考“多路I/O复用”中的select函数组介绍:

4、Close

关闭一个匿名管道可以使用标准的文件关闭函数——close 函数。
由于匿名管道存在两个文件描述符,所以关闭一个匿名管道时必须使用 close 函数关闭匿名管道的两个文件描述 符。
同时,由于子进程(如果存在)继承了匿名管道的两个文件描述符,所以子进程也需要关闭匿名管道的两个文件描述符。
关于close函数的实现 参考“SylixOS文件I/O函数”中的对应描述:https://blog.csdn.net/Liangren_/article/details/107818912

 

猜你喜欢

转载自blog.csdn.net/Liangren_/article/details/112271095