当前位置:  开发笔记 > 运维 > 正文

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

如何解决《如何在命名管道(mkfifo)上执行非阻塞fopen?》经验,为你挑选了1个好方法。

如果我有一个程序创建并尝试使用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系统上运行的)



1> jpalecek..:

你可以open()管道O_RDONLY | O_NONBLOCK,如果你想要C流,你可以得到它fdopen().但是,可能存在select()-AFAIK 的问题,一个用于阅读的管道fd,没有编写者总是准备好阅读,并read()返回0,因此select()会无限期地触发.

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

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有