21

如果我有一个程序使用 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系统上运行的)

4

1 回答 1

21

您可以使用open()pipe O_RDONLY | O_NONBLOCK,如果您想要 C 流,可以使用fdopen(). 但是,-AFAIK 可能存在问题select(),一个为读取而打开的管道 fd 始终准备好读取,并read()返回 0,因此select()会无限期地触发。

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

于 2009-02-24T00:51:37.420 回答