关于C#:如何在命名管道(mkfifo)上执行非阻塞打开?

How do I perform a non-blocking fopen on a named pipe (mkfifo)?

如果我有一个程序创建并尝试使用mkfifo打开命名管道,那么如何打开管道以进行读取或写入而不会阻塞?

具体地说,我正在编写一个可以在有或没有gui(用Java编写)的情况下运行的C程序。

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

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

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

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

有什么建议吗?

(在Linux系统上运行)


您可以open()您的管道O_RDONLY | O_NONBLOCK,如果需要C流,则可以使用fdopen()获得它。但是,select()-AFAIK可能存在问题,为读取打开的管道fd总是没有准备好读取器,并且read()返回0,因此select()会无限期触发。

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