管道
#include <unistd.h>
int pipe(int pipefd[2]);
功能:创建一个匿名管道,用来进程间通信。
参数:int pipefd[2] 这个数组是一个传出参数。
pipefd[0] 对应的是管道的读端
pipefd[1] 对应的是管道的写端
返回值:
成功 0
失败 -1
- 管道默认是阻塞的:如果管道中没有数据,read阻塞,如果管道满了,write阻塞
- 注意:匿名管道只能用于具有关系的进程之间的通信(父子进程,兄弟进程)
写管道
char *buf[1024];
write(fd[1],buf,sizeof(buf));
读管道
while ((len = read(fd[0], buf, sizeof(buf) - 1)) > 0) {
printf("%s", buf);
memset(buf, 0, 1024);
}
管道重定向
while ((len = read(fd[0], buf, sizeof(buf) - 1)) > 0) {
printf("%s", buf);
memset(buf, 0, 1024);
}
管道的读写特点
- 所有的指向写端的文件描述符都关闭了(写端引用计数都为0),那么管道中剩余的数据被读取以后,再次read会返回0,(read错误会返回-1),就像读到文件末尾一样。
- 如果写端引用计数大于0,而没有往管道里写数据,管道里没数据的时候会那么read会阻塞,直到管道中有数据可以读了才读取数据并返回;
- 如果读端引用计数为0,有进程往里写数据就会收到一个信号
SIGPIPE
,通常会导致进程异常终止; - 如果读端应用技术大于0,在管道被写满之后write会阻塞,直到管道中有空位置才能再次写入数据并返回;
总结
- 读管道:
- 管道中有数据:read返回读到的字节数
- 无数据:
写端被全部关闭:返回0
没有完全关闭:read阻塞
- 写管道:
- 读端全部关闭:进程异常终止
- 读端未完全关闭:
- 管道已满:write阻塞
- 管道未满:write将数据写入,返回写入字节数。