gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:20:44 24 4
gpt4 key购买 nike

我想在 2 个进程(AB)之间使用 2 个命名管道(a2bb2a) 如下:

  1. 进程 A 使用 mkfifo(3) 创建 a2bb2a 管道。
  2. 进程 A 启动进程 B(使用 fork()exec*() 甚至 系统())
  3. A 等到 B open() a2bb2a
  4. A write()的数据到a2b
  5. B read()s 数据来自 a2b
  6. B write()的数据到b2a
  7. A read()来自b2a
  8. 的数据

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

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

最佳答案

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

The kernel maintains exactly one pipe object for each FIFO special file that is opened by at least one process. The FIFO must be opened on both ends (reading and writing) before data can be passed. Normally, opening the FIFO blocks until the other end is opened also.

A process can open a FIFO in nonblocking mode. In this case, opening for read-only succeeds even if no one has opened on the write side yet and opening for write-only fails with ENXIO (no such device or address) unless the other end has already been opened.

所以你有两个选择:

  1. 使用阻塞模式,open 调用将阻塞直到另一端打开,或者
  2. 使用非阻塞模式并旋转 open 调用直到成功。

如果您的要求允许,您可以完全跳过命名管道 (FIFO),只使用 pipe .子进程将打开的文件描述符继承到管道的每一端,并且可以根据需要使用其中一个(不要忘记关闭不需要的描述符)。


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

关于c++ - 如何等待命名管道的另一端打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48697193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com