管道功能:
多线程编程中,管道可用于线程间的通信。一个线程生成数据,另一个线程消费数据。
管道限制:
1.管道是半双工的,即数据只能在一个方向上流动。这意味着需要双方通信时,必须建立两个独立的管道。
2.无名管道只能用于具有共同祖先(如父进程与fork出的子进程)之间的通信。近缘关系进程
3.管道的缓冲区大小由常量PIPE_BUF规定。如果对管道调用write且要求写的字节数小于等于PIPE_BUF,则此操作不会与其他进程对同一管道写入产生冲突。但是,当写入超过缓冲区大小时,可能会导致SIGPIPE信号的产生。
函数接口(具体实现)int pipe(int fd[2])
int pipe(int fd[2]) #include<unistd.h>
功能:
创建无名管道
参数:
文件描述符:fd[0]
读端:fd[1]
写端:fd[2]
返回值:
成功:0
失败:-1
读写特性
- 当管道中无数据时,读操作会阻塞管道中无数据时,将写端关闭,读操作会立即返回
- 管道中装满(管道大小64k)数据,写阻塞,一旦有4k空间,写继续
- 只有在管道的读端存在时,向管道中写入数据才有意义。否则,会导致管道破裂,向管道中写入数据的进程将收到内核传来的SIGPIPE信号: (通常Broken pipe错误)。Broken pipe:管道破裂