目录
- 管道是 SylixOS 进程间通信的一种方式。
- 管道分为匿名管道 pipe 和命名管道 fifo。
- 管道有两个端口:读端和写端,并且只允许数据从写端流向读端,所以管道是一种流式设备。
- 个人理解:可以将管道理解为是一种使用特殊结构读写的文件。
匿名管道实际操作可以使用标准文件读写函数(read、write),但并不存在于文件系统中,其使用是依赖于父子进程文件描述符的继承关系,因此只能用于父子进程通信。
对于没有血缘关系的进程(不存在文件描述符的继承),可以使用命名管道进行通信。
创建一个命名管道可以使用 mkfifo 函数。通过mkfifo 函数可以指定命名管道的设备文件路径(存在于文件系统中), 其他进程可以使用标准的文件打开函数——open 函数打开该命名管道,然后使用 read 和write 函数对命名管道进行读和写操作。
1、Creat
创建命名管道类似于创建文件,因此命名管道的路径名存在于文件系统中,函数原型及介绍如下。
#include <unistd.h>
int mkfifo(const char *pcFifoName, mode_t mode);
函数 mkfifo 原型分析:
- 此函数成功返回错误号 0,失败返回-1 并设置错误号;
- 参数 pcFifoName 指定了命名管道的设备文件路径;
- 参数 mode 指定了命名管道的设备文件模式,与 open 函数的模式位相同。
2、Open
由于命名管道存在于文件系统中,所以可以使用标准的文件打开函数——
open
函数打开命名管道。
调用 open
函数时参数
iFlag
是命名管道的打开标志,参数
iFlag 除了可以使用表 1 中匿名管道的文件标志,还可以使用表 2 中的标志。
3、Read/Write
命名管道的读和写操作分别使用标准的文件读写函数——read 和 write 函数。
read、write函数的实现可参考“SylixOS文件I/O函数”中的对应描述:https://blog.csdn.net/Liangren_/article/details/107818912
4、Wait
在命名管道为空或满时,读或写命名管道操作将被阻塞(除非使用
open
函数打开命名管道时参数 iFlag
指定了
O_NONBLOCK
选项),而等待一个命名管道可读或可写,可以调用 select
函数。
当 select 返回时,我们可以得知多少文件描述符就绪了,以及哪些文件描述符就绪了,使用这些就绪的文件描述符可以进行 read、write 等操作。
5、Close
关闭一个命名管道可以使用标准的文件关闭函数——close 函数。
close函数的实现可参考“SylixOS文件I/O函数”中的对应描述:https://blog.csdn.net/Liangren_/article/details/107818912
6、Delete
命名管道的删除使用标准的文件删除函数——
unlink
函数。