【发布时间】:2010-10-09 11:07:54
【问题描述】:
如果我有一个程序创建并尝试使用 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系统上运行的)
【问题讨论】:
-
是否需要在 select() 在输入管道上触发之前打开输出管道?
-
@tinkertim - 我想技术上不是 - 我已经在设置函数中设置了它们,但我可以先设置输出管道然后调用 select,为什么?
标签: c linux named-pipes blocking fifo