如何在命名管道(mkfifo)上执行非阻塞fopen?

时间:2009-02-24 00:34:22

标签: c linux named-pipes blocking fifo

如果我有一个使用mkfifo创建并尝试打开命名管道的程序,如何在不阻塞的情况下打开管道进行读写?

具体来说,我正在编写一个可以使用或不使用gui(用Java编写)运行的C程序。

在C程序中,我使用mkfifo成功创建了命名管道,但是当我这样做时

FILE* in = fopen(PIPE_IN, "r"); /* Where PIPE_IN is the filename*/

在GUI打开该管道进行写入之前,fopen不会返回。我想做的是让管道准备好被读取一次(如果)GUI决定写入它 - 我将把文件描述符放在select()调用中。期望java GUI可能永远不会真正启动是合理的,所以我不能依赖它在任何特定点甚至根本不能打开管道的另一端。

我还会打开第二个管道进行写作,我想我会遇到同样的问题。此外,我无法在没有读卡器的输出管道上设置O_NONBLOCK。

有什么建议吗?

(这是在linux系统上运行的)

1 个答案:

答案 0 :(得分:13)

您可以open()您的管道O_RDONLY | O_NONBLOCK,如果您想要C流,您可以使用fdopen()获取它。但是,select() - AFAIK可能存在问题,一个用于阅读的管道fd,没有作家总是准备阅读,而read()返回0,所以select()会无限期地开火。

克服这个问题的一种方法是打开管道O_RDWR;也就是说,至少有一个编写器(你的C ++程序)。无论如何,这将解决你的问题。