FIFO 非阻塞写+非阻塞读+延时循环读的一种方法

本文详细阐述了如何使用mkfifo建立有名管道,并通过非阻塞写和非阻塞读的方式进行数据交互。讨论了在不同open参数设置下,读写程序的行为及数据传递的特性,包括读取数据的延迟和管道数据准备时间的影响。同时,提出了使用while循环读取数据直至获取到内容的方法,以及如何设置合理的超时机制来避免程序阻塞。最后介绍了通过定时器实现延时循环读取的过程,确保数据能够及时被读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 转载请说明出处:

http://blog.youkuaiyun.com/xbl1986/article/details/7052178FIFO

非阻塞写+非阻塞读+延时循环读的一种方法

 
用mkfifo在当前目录下建立一个myfifo的有名管道


只运行非阻塞写的程序 open参数为O_WRONLY | O_NONBLOCK
write失败,这是man手册里面说明了的情况


如果open参数为O_RDWR | O_NONBLOCK
写程序则可以立即返回
但是当运行完写程序之后再运行读程序,发现没有从管道里读出任何数据出来。
也就是说管道里面是空的,没有存入任何数据。
写程序中判断了write的返回值,不是-1


如果open参数为O_WRONLY
则为写阻塞
当执行读程序的时候写程序才会返回


当读程序中的open参数为O_RDONLY
这时候是读阻塞
当先运行读程序的时候,写程序是不是阻塞的无所谓,都可以读到数据
但是,非阻塞的写,是没法读到数据的。似乎非阻塞的写没有把数据写入管道中。后面证明,是读需要多次才能读到,这中间存在了一个准备时间之类东西……


设置读程序中open的参数为O_RDWR|O_NONBLOCK
这时候是非阻塞读管道
当没有任何写程序执行的时候read返回-1,错误码是EAGAIN
当写是阻塞写的时候,非阻塞读依然不能读到数据


写的open参数为O_RDWR的时候即为非阻塞写


阻塞读+非阻塞写的组合可以读到数据,先进行读
阻塞读+阻塞写的组合可以读到数据,无所谓谁先运行
非阻塞读+任何写的方法,都不能读到数据


在非阻塞读的程序中加入while循环读,直到读出数据为止
这种情况下阻塞写/非阻塞写都可以读到数据


说明管道数据准备好的时间很长……,一次基本上非常不靠谱
但是使用while读基本上也就是阻塞读了
因为会阻塞整个程序,因此需要有一个合理的超时机制来保证读管道不阻塞,但是可以等一定的时间


等待时间需要用到定时器,简单的可以使用select,但是不能用在一个进程里,因为select会阻塞。
因此可以开另一个线程,定时,时间到,修改变量
在while读中用变量作为while判断条件,选择退出while


这个定时器的超时时间是一种约束,要求在这段时间内必须向管道内写入数据,不然则返回没有读到数据
因此,写管道的程序所要保证的就是写管道的时间间隔必须要小于这个超时时间
因为这个超时时间是很容易被修改的,因此只需要估计出写管道的时间间隔就可以确定这个超时时间了。


这样就形成了一个非阻塞写+非阻塞读_延时循环读的结构
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值