如果我有一个创建并尝试使用mkfifo打开命名管道的程序,我如何才能在不阻塞的情况下打开一个读写管道?
具体地说,我正在编写一个C程序,它可以在有或没有gui的情况下运行(用Java编写)。
在C程序中,我使用mkfifo成功地创建了命名管道,但是当我这样做时
FILE* in = fopen(PIPE_IN, "r"); /* Where PIPE_IN is the filename*/
直到GUI打开该管道进行写入,fopen才会返回。我想要做的是,一旦GUI决定对其进行写操作,就可以读取该管道--我将把文件描述符放在一个select()调用中。预期java GUI可能永远不会真正启动是合理的,因此我不能依赖它在任何特定的点上打开管道的另一端,甚至根本不能。
我还将打开第二个管道进行编写,我假设我也会遇到同样的问题。此外,我不能在没有阅读器的输出管道上设置O_NONBLOCK。
有什么建议吗?
(它在linux系统上运行)
发布于 2009-02-24 00:51:37
你可以
open()
你的管道
O_RDONLY | O_NONBLOCK
,如果你想要C流,你可以用
fdopen()
得到它。但是,
select()
- AFAIK可能会有问题,打开读取的管道fd没有写入器,但始终准备读取,并且
read()
返回0,因此
select()
将无限期触发。
克服这个问题的一种笨拙方法是打开管道
O_RDWR
;也就是说,至少有一个编写器(您的C++程序)。无论如何都能解决你的问题。
https://stackoverflow.com/questions/580013
复制相似问题
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2024 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287