pipe设置阻塞/非阻塞模式
Linux父子进程间的通信可以用pipe实现。本文介绍关于pipe的阻塞/非阻塞模式。
阻塞 / 非阻塞 模式
默认管道的读写两端都为阻塞模式。
阻塞模式下有两个特征:
-
当读管道时,如果管道中没有数据,则会阻塞,直到管道另一端写入数据。
-
当写管道时,如果管道中已经满了,则会阻塞,直到管道另一端读出数据(读出的数据会从管道中清除)。
更改 阻塞 / 非阻塞 模式
使用fcntl函数,只需两步就可实现。
int flags = fcntl(fd[0],F_GETFL); // 获取原先flag
flags = flags | O_NONBLOCK; // 修改flag
附录
pipe关闭端口后的读写情况
-
当管道写端关闭时,读端读完管道内的数据时,如果再次去读没有数据的管道会返回0,相当于读到了EOF。
-
当管道读端关闭时,如果写端在写入数据时,产生SIGPIPE信号,写进程默认情况下会终止进程。
判断管道缓冲区上限
要判断管道什么时候会满,可以用fpathconf(fd[0], _PC_PIPE_BUF)
查看管道的缓冲区上限。