如何等待命名管道的另一端打开?

时间:2018-02-09 00:57:11

标签: c++ c unix posix named-pipes

我想使用2个命名管道(AB)在2个进程(a2bb2a)之间交换数据,如下所示:

  1. 流程A使用a2b创建b2amkfifo(3)管道。
  2. 流程A启动流程B(使用fork()exec*()甚至system()
  3. A等到B open() s a2bb2a
  4. A write()将数据发送至a2b
  5. 来自B
  6. read() a2b个数据
  7. B write()将数据发送至b2a
  8. 来自A
  9. read() b2a个数据

    如何让进程A等到进程B open()成为命名管道的另一端? - 即如何实施第3步?

    编辑1:正如@EJP所提到的,可以使用读/写/选择来实现步骤3。但是,我想知道是否有其他方法。

1 个答案:

答案 0 :(得分:6)

为FIFO指定了POSIX open的行为。如果你正在使用Linux,man 7 fifo有一些很好的讨论:

  

内核为每个FIFO特殊维护一个管道对象      由至少一个进程打开的文件。必须打开FIFO      在数据传递之前的两端(读和写)。      通常,打开FIFO块直到另一端打开。

     

进程可以在非阻塞模式下打开FIFO。在这种情况下,打开      即使没有人在写入端打开,只读成功      然而,只有写入才能打开ENXIO(没有这样的设备或      地址)除非另一端已经打开。

所以你有两个选择:

  1. 使用阻止模式,open调用将阻塞,直到另一端打开,或
  2. 使用非阻止模式并旋转open调用,直至成功。
  3. 如果您的要求允许,您可以完全跳过命名管道(FIFO)并使用pipe。子进程将继续打开的文件描述符继承到管道的每一端,并且可以根据需要使用任何一个(不要忘记关闭不需要的描述符)。

    但是,考虑到您的最终目标是双向通信,我可以建议(unix domainsocket和一些IO多路复用策略(selectpoll,{ {1}},epoll等)?