我想使用2个命名管道(A
和B
)在2个进程(a2b
和b2a
)之间交换数据,如下所示:
A
使用a2b
创建b2a
和mkfifo(3)
管道。A
启动流程B
(使用fork()
,exec*()
甚至system()
)A
等到B
open()
s a2b
和b2a
A
write()
将数据发送至a2b
B
的read()
a2b
个数据
B
write()
将数据发送至b2a
A
的read()
b2a
个数据
醇>
如何让进程A
等到进程B
open()
成为命名管道的另一端? - 即如何实施第3步?
编辑1:正如@EJP所提到的,可以使用读/写/选择来实现步骤3。但是,我想知道是否有其他方法。
答案 0 :(得分:6)
为FIFO指定了POSIX open的行为。如果你正在使用Linux,man 7 fifo
有一些很好的讨论:
内核为每个FIFO特殊维护一个管道对象 由至少一个进程打开的文件。必须打开FIFO 在数据传递之前的两端(读和写)。 通常,打开FIFO块直到另一端打开。
进程可以在非阻塞模式下打开FIFO。在这种情况下,打开 即使没有人在写入端打开,只读成功 然而,只有写入才能打开ENXIO(没有这样的设备或 地址)除非另一端已经打开。
所以你有两个选择:
open
调用将阻塞,直到另一端打开,或open
调用,直至成功。如果您的要求允许,您可以完全跳过命名管道(FIFO)并使用pipe
。子进程将继续打开的文件描述符继承到管道的每一端,并且可以根据需要使用任何一个(不要忘记关闭不需要的描述符)。
但是,考虑到您的最终目标是双向通信,我可以建议(unix domain)socket
和一些IO多路复用策略(select
,poll
,{ {1}},epoll
等)?