IPC之管道和FIFO的额外属性


前文:

IPC之管道详解

IPC之FIFO(有名管道)详解


关于阻塞与非阻塞:

首先,一个描述符能以两种方式设置成非阻塞。

(1)调用open时可指定O_NONBLOCK标志。

(2)如果一个描述符已经打开,那么可以调用fcntl以启用O_NONBLOCK标志。

因为管道没有open调用,在pipe调用中没法指定O_NONBLOCK标志,所以管道必须使用fcntl函数来设置。


图4-21给出了非阻塞标志对于一个打开FIFO的影响、对一个空管道或空FIFO读出数据的影响以及对一个管道或FIFO写入数据的影响。



下面是关于管道或FIFO的读出与写入的若干额外规则。

(1)如果请求读出的数据量多于管道或FIFO中当前可用数据量,那么只返回这些可用的数据。


(2)如果请求写入的数据的字节数小于或等于PIPE_BUF(一个Posix限制值,可以通过getconf命令查看PIPE_BUF的大小),那么write操作保证的原子的。这意味着,如果有两个进程差不多同时往同一个管道或FIFO写,那么或者先写入来自第一个进程的所有数据,再写入来自第二个进程的所有数据,或者颠倒过来。系统不会互相混杂来自这两个进程的数据。然而,如果请求写入的数据的字节数大于PIPE_BUF,那么write操作不能保证是原子的。


(3)O_NONBLOCK标志的设置对write操作的原子性没有影响。原子性完全是由所请求字节数是否小于等于PIPE_BUF决定的。然而当一个管道或FIFO设置成非阻塞时,来自write的返回值取决于待写的字节数以及该管道或FIFO中当前可用空间的大小。

写入的字节数小于等于PIPE_BUF:

a.如果该管道或FIFO中有足以存放所请求字节数的空间,那么所有数据字节都写入。

b.如果该管道或FIFO中没有足以存放所请求字节数的空间,那么立即返回一个EAGAIN错误。

写入的字节数大于PIPE_BUF:

a.如果该管道或FIFO中至少有1字节空间,那么内核写入该管道或FIFO能容纳数目的数据字节,该数目同时作为来自write的返回值。

b.如果该管道或FIFO已满,那么立即返回一个EAGAIN错误。


(4)如果向一个没有为读打开着的管道或FIFO写入,那么内核将产生一个SIGPIPE信号;

a.如果调用进程既没有捕获也没有忽略该SIGPIPE信号,所采取的默认行为就是终止该进程。

b.如果调用进程忽略了该SIGPIPE信号,或者捕获了该信号并从其信号处理程序中返回,那么write返回一个EPIPE错误。


参考:《unix网络编程》·卷2


End;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值