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

本文探讨了FIFO管道中非阻塞写与非阻塞读的实现方式及其交互问题。在不同open参数组合下,分析了读写程序的阻塞与非阻塞行为。通过实验发现,非阻塞写可能需要多次读取才能从管道中获取数据,且在非阻塞读的情况下,需要加入循环读机制并配合超时机制,如使用线程和定时器来避免程序阻塞。这种方法适用于需要确保在限定时间内读取到管道数据的场景。

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

用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读基本上也就是阻塞读了
因为会阻塞整个程序,因此需要有一个合理的超时机制来保证读管道不阻塞,但是可以等一定的时间


等待时间需要用到定时器,简单的可以
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值