现在的位置: 首页 > 综合 > 正文

FIFO 非阻塞写+非阻塞读+延时循环读的一种方法 http://blog.csdn.net/xbl1986/article/details/7052178FIFO

2012年09月07日 ⁄ 综合 ⁄ 共 1980字 ⁄ 字号 评论关闭

 转载请说明出处:

http://blog.csdn.net/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

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

这样就形成了一个非阻塞写+非阻塞读_延时循环读的结构

用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

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

这样就形成了一个非阻塞写+非阻塞读_延时循环读的结构

抱歉!评论已关闭.