如果我有一个程序创建并尝试使用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楼 票数:14 已采纳

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

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

  ask by Zxaos translate from so

未解决问题?本站智能推荐:

1回复

命名管道:如何阻塞直到重新打开关闭的写入侧?

我有一个正在运行的进程,该进程基本上充当缓存并通过命名管道与其他进程通信。 这些其他进程可能会定期向缓存进程发送消息。 现在原则上在缓存过程中对我有用的是: 但这显然在性能上很烂,因为read()将在EOF立即返回,一旦在管道中没有要读取的内容,就会导致繁忙的等待循环。 (编辑)我
1回复

如何接收来自多个命名管道的消息?

我必须在代码中使用fifo。 我用袜子接受新客户。 对于每个客户端,我创建一个新线程来向他发送和接收消息。 在线程功能中,我使用fifo向其他进程发送和接收消息,这是我的代码: 另一方面(另一过程)我的代码: 我的问题是在此过程中: s_to_c和c_to_s始终取
1回复

在Linux上由两个命名管道(FIFO)循环链接的两个过滤器

我想使两个进程通过Linux上的两个命名管道相互通信。 每个进程都是Unix过滤器:它在其标准输入上读取数据,并在其标准输出上写入数据。 它们是环形链接的,因为第一个的输出是第二个的输入,反之亦然。 这是第一个过滤器(ac)的代码: 这是第二个过滤器(bc)的代码: 我
1回复

POSIX FIFO 在阻塞模式下打开时冻结

默认情况下,POSIX FIFO 以阻塞模式打开。 我的问题是,当我以阻塞模式打开它时,它只是冻结(阻塞)而没有其他任何事情发生。 最初我用 RDWR 标志打开两边,我没有问题,因为 RDWR 使它成为非阻塞,因为“在 Linux 下,打开 FIFO 进行读写将在阻塞和非阻塞模式下都成功”( ht
1回复

什么条件导致打开的非阻塞命名管道(fifo)对于读取“不可用”?

情况: 读取偶尔会引发错误-11:资源暂时不可用。 什么时候出现这个错误? 这似乎非常罕见,因为常见情况返回数据: 如果没有编写器打开管道,则返回空的str('')。 如果编写器已打开管道,但fifo中没有数据,则还返回空str('') 当然,如果作者将
1回复

命名管道到常规文件

Linux:我已经打开了一个命名管道-我可以看到 但是过了一会儿,它变成了常规文件 知道如何发生吗? 所有权也发生了变化。 有趣的是usrA实际上是比usrB更特权的用户
1回复

如何避免并行命名管道的死锁?

我正在开发一个基于流的编程系统net2sh 。 它当前基于通过命名管道连接的Shell工具。 多个过程协同工作以完成工作,并通过命名管道进行通信,这与工厂的生产线不同。 总的来说,它运行良好,但是存在一个主要问题。 在进程通过两个或多个命名管道进行通信的情况下,“发送”过程和“接收”
1回复

没有子进程的命名管道

我将FIFO用于简单的读/写程序,其中用户的输入由writer函数写入标准输出。 但是问题是,我是否可以运行该程序而无需创建子进程(使用fork()操作)。 从我从有关FIFO的示例中所看到的来看,大多数具有命名管道/ FIFO的读/写程序都是由2个文件完成的-一个用于读取,一个用于写入。