linux程序设计——对FIFO进行读写操作(第十三章)

4.对FIFO进行读写操作
使用O_NONBLOCK模式会影响的对FIFO的read和write调用.
对一个空的,阻塞的FIFO
(即没有用O_NONBLOCK标志打开) 的read调用将等待,直到有数据可以读时才继续执行.与此相反, 对一个空的,非阻塞的FIFO的read调用将立刻返回0字节.
对一个完全阻塞的FIFO的write调用将等待,直到数据可以写入时才继续执行
. 如果非阻塞的FIFO不能接收所有写入的数据,它将按下面的规则执行.
如果请求写入的数据长度小于等于PIPE_BUF字节,调用失败,数据不能写入.
如果请求写入的数据长度大于PIPE_BUF字节,将写入部分数据,返回实际写入的字节数,返回值也可能是0.
FIFO的长度是需要考虑的一个很重要的因素,系统对任一时刻在一个FIFO中可以存在的数据长度是有限制的,它由#define PIPE_BUF语句定义,通常可以在头文件limits.h中找到它.在linux和许多其他类UNIX系统中,它的值通常是4096字节,但在某些系统中它可能会小到512字节.系统规定:在一个以O_WRONLY方式(即阻塞方式)打开的FIFO中,如果写入的数据小于等于PIPE_BUF,那么或者写入全部字节,或者一个字节都不写入.
虽然,对只有一个FIFO写进程和一个FIFO读进程的简单情况来说,这个限制并不是非常重要的, 但只使用一个FIFO并允许多个不同的程序向一个FIFO读进程发送请求的情况是很就常见的.如果几个不同的程序尝试同时向FIFO写数据,能否保证来自不同程序的数据库不相互交错就非常关键了.也就是说, 每个写操作都必须是"原子化"的.怎样才能做到这一点呢?
如果能保证所有的写请求是发往一个阻塞的FIFO的,并且每个请求的数据长度小于等于PIPE_BUF字节,系统就可以
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值