如果我有一个程序使用 mkfifo 创建并尝试打开命名管道,如何在不阻塞的情况下打开管道进行读取或写入?
具体来说,我正在编写一个 C 程序,它可以在有或没有 GUI 的情况下运行(用 Java 编写)。
在 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,一个没有 writer 的打开用于读取的管道 fd 总是准备好读取,并且read()
返回 0,因此select()
会无限期地开火。
克服这个问题的一个笨办法是打开管道O_RDWR
;也就是说,至少有一名编写者(您的 C++ 程序)。无论如何这都会解决你的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)