如果我有一个程序创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 ++程序)。 无论如何,这将解决您的问题。