4. 卷2(进程间通信)---管道和FIFO
程序员文章站
2022-05-14 08:06:15
...
如果调用进程即没有捕获也没有忽略 SIGPIPE信号,那么默认行为就是终止该进程。
如果调用进程捕获或者忽略了 SIGPIPE 信号,那么write返回一个 EPIPE 错误。
内核为 管道和 fifo 维护一个访问计数器,删除的话,先前打开的不受影响。
设置非阻塞: open(fd,O_WRONLY|O_NONBLOCK,1)
如果是已经打开的文件描述符用 :
flags = fcntl(fd,FD_GETFL,flags) ;
flags |= O_NONBLOCK ;
fcntl(fd,FD_SETFL,flags) ;
1.如果请求的数据多余管道里面的,只返回管道里面可用数据量
2.如果写入的数据 <= PIPE_SIZE ,那么 write 保证是原子操作(这意味着,如果2个write 同时发生,
要么1先写入,2再写入,或者相反。系统不会混杂数据)。如果写入数据 > PIPE_SIZE 那么不能保证原子性。
3.O_NONBLOCK标志对write操作原子性没有影响,但返回的字节数取决于待写的字节数以及管道内当前可用空间大小。
<= PIPE_SIZE : 如果有足够空间则写入,
没有足够空间,立即返回一个 EAGAIN错误。既然设置了O_NONBLOCK就表明调用进程不希望自己被投入睡眠中,但内核无法在接受部分数据的同时仍然保证原子性,于是返回一个错误。
> PIPE_SIZE : 如果有至少大于1的空间,就写入,返回该空间大小。
如果已经满了,返回一个 EAGAIN 错误。
3.如果向一个没有为读打开着的管道或者fifo写入,那么内核将产生一个 SIGPIPE 信号
1.概述
2.一个简单的客户-服务器例子
3.管道
4.全双工管道
popen 和 pclose 函数
FIFO
7.管道和 FIFO 的额外属性
8.单个服务器,多个客户
- 对比迭代服务器与并发服务器
10.字节流与消息
11.管道和 FIFO 限制