管道的读写操作:
读操作:
- 有数据:read正常读,返回读出的字节数
- 无数据:1 写段全部关闭:read解除阻塞,返回0,相当于文件读到了尾部
- 2 写段没有全部关闭:read阻塞
写操作:
- 读端全部关闭:管道破裂,进程终止,内核给当前进程发SIGPIPE信号
- 读端没有全部关闭:缓冲区写满了,write阻塞
- 缓冲区没有满,继续write
设置管道为非阻塞:
若想设置读写两端为非阻塞,则可以这样做:
int flag=fcntl(fd[0],F_GETFL,0);
flag = flag | NONBLOCK;
fcntl(fd[0],F_SETFL,flag);
若是读端为非阻塞:
写端没有关闭:管道中没有数据可读,返回-1
写端没有关闭:管道中有数据可读,返回实际读到的字节数
写端已经关闭:管道中有数据可读,返回实际读到的字节数
写端已经关闭:管道中没有数据可读,返回0
如何查看管道缓冲区大小:
ulimit -a
如下: