如果我有一个创建并尝试使用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-23 16:51:37
你可以open()
你的管道O_RDONLY | O_NONBLOCK
,如果你想要C流,你可以用fdopen()
得到它。但是,select()
- AFAIK可能会有问题,打开读取的管道fd没有写入器,但始终准备读取,并且read()
返回0,因此select()
将无限期触发。
克服这个问题的一种笨拙方法是打开管道O_RDWR
;也就是说,至少有一个编写器(您的C++程序)。无论如何都能解决你的问题。
https://stackoverflow.com/questions/580013
复制相似问题