进程通信——命名管道

目录

1、Creat

2、Open

3、Read/Write

4、Wait

5、Close

6、Delete


  • 管道是 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 函数。

猜你喜欢

转载自blog.csdn.net/Liangren_/article/details/112303148
今日推荐