mad*_*uri 3 c c++ unix posix named-pipes
我想在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()
s命名管道的另一端? - 即如何实施第3步?
编辑1:正如@EJP所提到的,可以使用读/写/选择来实现步骤3.但是,我想知道是否还有其他方法.
POSIX open的行为是为FIFO指定的.如果您使用的是Linux,请man 7 fifo
进行一些讨论:
内核为至少一个进程打开的每个FIFO特殊文件保留一个管道对象.在传递数据之前,必须在两端打开FIFO(读取和写入).通常,打开FIFO块直到另一端打开.
进程可以在非阻塞模式下打开FIFO.在这种情况下,即使在写入端尚未打开任何人,只读打开也是成功的,并且只有在没有这样的设备或地址的情况下,只读打开失败,除非另一端已经打开.
所以你有两个选择:
open
呼叫将阻塞,直到另一端打开,或open
调用直到成功.如果您的要求允许,您可以完全跳过命名管道(FIFO)并使用pipe
.子进程将继续打开的文件描述符继承到管道的每一端,并且可以根据需要使用任何一个(不要忘记关闭不需要的描述符).
但是,考虑到你的最终目标是双向通信,我可能会建议一个(Unix域)socket
和一些IO复用策略(select
,poll
,epoll
,kqueue
,等)?
归档时间: |
|
查看次数: |
1050 次 |
最近记录: |