进程间通讯 --- 管道(半双工通信)

时间:2024-05-21 14:41:45

管道:

一个进程输出数据到另一个进程数据输入的通道。(半双工通信:同一时间,只能一端读另一端写,因为只有一条信道)

有名管道(命令管道):

在磁盘上会存在一个管道文件标识,但管道文件不占用磁盘block空间,数据会缓存在内存上

可应用于同一台主机上的有权限访问的任意n个进程间通讯。(必须有一对读写进程

进程间通讯 --- 管道(半双工通信)

 有名管道使用:

创建管道文件:

     命令   mkfifo 文件名

     函数:int mkfifo(const char * pathname, int mode);

打开:open();write(); read(); close();

 

创建管道文件:

进程间通讯 --- 管道(半双工通信)

注意:

必须有一对读-写,只读或只写则会阻塞。

如果所有的读端关闭,则写端也会退出,反之亦然。

读写的次数没有直接联系。

如果写端保持但没有写数据(管道文件没有数据),读端阻塞。当写端将内存写满时,则写端阻塞。


 

无名管道(仅限父子进程):

没有管道文件标识,借助父子进程之间共享fork之前打开的文件描述符,其数据内容也是在内存上缓存。(一端写一端读)
进程间通讯 --- 管道(半双工通信)

无名管道的使用:父子进程间通讯

创建&打开: int 匹配(int fds[2]); 创建无名管道并打开,使得fds[0]为读端,fds[1]为写端;

注意:

父子进程必须关闭一对读写,并且不能是同一个进程关闭读写;

逻辑保持管道的半双工通信,防止一端关闭对应的读或写,而另一端无法感知;

进程间通讯 --- 管道(半双工通信)