繁体   English   中英

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

How do I perform a non-blocking fopen on a named pipe (mkfifo)?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

如果我有一个程序创建并尝试使用 mkfifo 打开一个名为 pipe 的程序,我如何打开一个 pipe 进行读取或写入而不阻塞?

具体来说,我正在编写一个 C 程序,它可以在有或没有 gui(用 Java 编写)的情况下运行。

在 C 程序中,我使用 mkfifo 成功创建了命名管道,但是当我这样做时

FILE* in = fopen(PIPE_IN, "r"); /* Where PIPE_IN is the filename*/

fopen 在 GUI 打开 pipe 进行写入之前不会返回。 我想做的是让 pipe 准备好读取一次(如果)GUI决定写入它 - 我将把文件描述符放在 select() 调用中。 可以合理地预期 java GUI 可能永远不会真正启动,所以我不能指望它在任何特定点甚至根本不打开 pipe 的另一端。

我还将打开第二个 pipe 进行写入,我想我也会遇到同样的问题。 此外,我无法在没有阅读器的 output pipe 上设置 O_NONBLOCK 。

有什么建议么?

(这是在 linux 系统上运行的)

1 个回复

你可以open()你的 pipe O_RDONLY | O_NONBLOCK O_RDONLY | O_NONBLOCK ,如果你想要 C stream ,你可以用fdopen()得到它。 但是, select()可能存在问题 - AFAIK,一个 pipe fd 打开读取,没有写入器始终准备读取,并且read()返回 0,因此select()将无限期触发。

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

1 如何在Android中创建命名管道(mkfifo)?

我在Android中创建命名管道时遇到了麻烦,下面的例子说明了我的困境: 代码始终打印: 我无法弄清楚为什么会失败。 该应用程序具有android.permission.WRITE_EXTERNAL_STORAGE权限。 我可以在同一位置创建具有完全相同名称的普通文件,但管道 ...

2 非阻塞命名管道

问题摘要:我设法加快了图像的翻阅速度,从而大大提高了图像的翻译速度,这是以使用并发为代价的。 现在我需要确保对竞争条件的并发性。 我将依赖脚本轮询正常文件的状态为独立的,但随后决定命名管道会更好。 管道以避免轮询并命名,因为我无法从打开它们的脚本中获取PID(这是我需要使用管道进行通信的那 ...

3 Linux命名管道-MKFIFO查询

我在命名的Linux BASH,命名的管道等中还算是新手。我正在按照本文中的示例进行操作: https : //www.linuxjournal.com/content/using-named-pipes-fifos-bash一切正常,符合预期。 但是,这仅仅是开始。 我希望能够从阅读器中调 ...

5 命名管道(mkfifo)输出格式

我正在使用命名管道,以便读者和作者可以进行交流。 我要移动的文本是由字符串text [lines]组成的数组,每行包含4个单词(或数字),中间用空格隔开。 读者是: 和作家: 但是,编写器的输出并不总是相同的。 有时它会忽略换线,因此输出会成块出现。 有些与预期一致,而其 ...

6 命名管道类似于“mkfifo”创建,但是双向

我想创建一个命名管道,就像“mkfifo”创建的那样,但有一点需要注意。 我希望管道是双向的。 也就是说,我希望进程A写入fifo,进程B进行读取,反之亦然。 由“mkfifo”创建的管道允许进程A读取写入管道的数据。 通常我会使用两个管道,但我试图模拟一个实际的设备,所以我希望open ...

7 Windows命名管道上的非阻塞读取

我需要使用Python(ctypes)从命名管道的窗口中实现非阻塞读写。 如果在服务器模式下打开管道,则可以实现此目的。 但是,当使用CreateFile与客户端打开管道时,我做不到。 不管管道是由服务器进程使用PIPE_NOWAIT创建的,ReadFile块都将被阻止。 我正在尝试 ...

8 记录到非阻塞命名管道?

我有一个问题,我无法在stackoverflow或网络上的任何地方找到帮助。 我有一个程序(芹菜分布式任务队列),我有多个实例(工人),每个实例都有一个日志文件(celery_worker1.log,celery_worker2.log)。 重要的错误存储在数据库中,但我喜欢在运行新 ...

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

在将大量数据写入管道时 ,由于挂起了进程 ,因此,我需要实现一种方法,使父进程从子进程写入的管道中读取父进程,同时执行其他操作直到子进程完成。 更具体地说,父级正在通过HTTP向客户端返回响应。 响应由字符串<PING/>组成,在完成ping操作后由字符串<DONE/& ...

2018-02-01 00:24:21 1 532   perl/ pipe
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM