管道:
一个进程输出数据到另一个进程数据输入的通道。(半双工通信:同一时间,只能一端读另一端写,因为只有一条信道)
有名管道(命令管道):
在磁盘上会存在一个管道文件标识,但管道文件不占用磁盘block空间,数据会缓存在内存上。
可应用于同一台主机上的有权限访问的任意n个进程间通讯。(必须有一对读写进程)
有名管道使用:
创建管道文件:
命令 mkfifo 文件名
函数:int mkfifo(const char * pathname, int mode);
打开:open();write(); read(); close();
创建管道文件:
注意:
必须有一对读-写,只读或只写则会阻塞。
如果所有的读端关闭,则写端也会退出,反之亦然。
读写的次数没有直接联系。
如果写端保持但没有写数据(管道文件没有数据),读端阻塞。当写端将内存写满时,则写端阻塞。
无名管道(仅限父子进程):
没有管道文件标识,借助父子进程之间共享fork之前打开的文件描述符,其数据内容也是在内存上缓存。(一端写一端读)
无名管道的使用:父子进程间通讯
创建&打开: int 匹配(int fds[2]); 创建无名管道并打开,使得fds[0]为读端,fds[1]为写端;
注意:
父子进程必须关闭一对读写,并且不能是同一个进程关闭读写;
逻辑保持管道的半双工通信,防止一端关闭对应的读或写,而另一端无法感知;