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

如果我有一个程序创build并试图使用mkfifo打开一个命名pipe道,我怎样才能打开pipe道读取或写入没有阻塞?

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

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

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

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

我也会有第二条pipe道,我想我也会遇到同样的问题。 此外,我不能在没有阅读器的输出pipe上设置O_NONBLOCK。

有什么build议么?

(这是在Linux系统上运行)

你可以open()你的管道O_RDONLY | O_NONBLOCK O_RDONLY | O_NONBLOCK ,如果你想要C流,你可以用fdopen()来获得它。 然而, select() – AFAIK可能会有问题,一个读取的管道fd打开,没有写入器总是准备读取,而read()返回0,所以select()会无限期地触发。

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