如果我有一个程序创建并尝试使用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系统上运行的)
你可以open()
管道O_RDONLY | O_NONBLOCK
,如果你想要C流,你可以得到它fdopen()
.但是,可能存在select()
-AFAIK 的问题,一个用于阅读的管道fd,没有编写者总是准备好阅读,并read()
返回0,因此select()
会无限期地触发.
克服这个问题的一种方法是打开管道O_RDWR
; 也就是说,至少有一个编写器(你的C++程序).无论如何,这将解决您的问题.