浅谈linux管道
管道的基本概念
管道是一种基本的IPC机制,作用在于使有血缘关系的进程之间完成数据传递。创建管道使用pipe函数,头文件是unistd.h
pipe函数的使用
#include<unistd.h>
int pipe(int filedes[2]);
返回值:成功返回0,否则返回-1。参数为包含两个整形的数组,即两个文件描述符,一个为写端,一个为读端。
管道的特点
1:管道本质为伪文件,是内核中的一个缓冲区
2:通过两个文件描述符来引用,分别对应读端和写端
3:数据从写端流入缓冲区,从读端流出缓冲区
管道的原理
管道实际为内核使用环形队列实现,借助于内核缓冲区
使用管道的四种特殊情况
1:如果所有指向管道的写端的文件描述符都关闭了,但仍有进程从读端读取数据。当管道中的数据被读完时,再次读取会读到0,即管道内数据的结尾字符。
2:如果有指向管道写端的文件描述符没有关闭,但也没有向管道中写入数据。当管道中的数据被读端读完后,再次读取会阻塞,等待写端写入数据。
3:如果所有指向管道读端的文件描述符都关闭了,但仍有进程向管道中写入数据,此时该写进程会收到SIGPIPE信号,导致异常终止。当然,也可以通过信号捕捉,防止写端进程终止。
4:如果有指向管道读端的文件描述符没有关闭,但也没有从管道中读取数据,写端一直向管道中写入数据,当管道中数据写满时,写入进程会阻塞,等读端从管道中读走数据后,继续写入。
实现代码: