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

Zxaos:

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

jpalecek:

您可以使用open()管道O_RDONLY | O_NONBLOCK,如果需要C流,可以使用fdopen()但是,-AFAIK可能存在问题,select()为读取打开的管道fd总是没有编写器可供读取,并且read()返回0,因此select()将无限期触发。

解决这个问题的一种肮脏的方式是打开管道O_RDWR; 也就是说,至少要有一个编写器(您的C ++程序)。无论如何,这将解决您的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

POSIX命名管道(FIFO)以非阻塞模式删除记录

如何在Sklearn管道中执行Onehotencoding

为什么打开命名管道会非阻塞地返回无效的文件描述符?

如何在自己的API上执行非GET请求

如何使用命名管道在fopen上设置超时

管道上的非阻塞读取

我可以在Linux上打开命名管道以使用Python进行非阻塞写入吗?

如何建立从unix管道的非阻塞读取?

读取不阻塞命名管道

如何在非阻塞套接字上处理OpenSSL SSL_ERROR_WANT_READ / WANT_WRITE

使用popen的非阻塞管道?

Shell /文件系统中的非阻塞/异步FIFO /命名管道?

如何在Android中的非UI线程上执行延迟

如何在busybox shell脚本中以非阻塞模式刷新命名管道(FIFO)?

如何在不删除的情况下检查非阻塞匿名管道是否有数据

如何在Windows上非阻塞地从python子进程中读取stdout?

在执行其他操作时非阻塞读取管道

如何停止在Python中的命名管道上阻塞的线程?

如何解除对已删除命名管道的阻塞?

如何使非提升过程可访问命名管道?

如何在fopen上使用DISP = SHR

Scala期货如何在线程上运行?以及如何将它们用于执行异步和非阻塞代码?

从非阻塞命名管道中读取将在Ubuntu中提供EFAULT(14)

mknod创建的命名管道和mkfifo创建的FIFO是否等效?

被命名为管道(mkfifo)是RabbitMQ的前身吗?

Angular 管道阻塞了模板函数的执行

如何在python中执行非阻塞脚本并获取其返回码?

如何在 spring 批处理中制作非阻塞项目处理器(不仅与任务执行器异步)?

Python通过非阻塞写入命名管道避免部分写入