从 C++ 中的命名管道同时读写

问题描述 投票:0回答:1

我有一个进程 A 正在连续写入命名管道。它已在 O_NONBLOCK | 中打开它。 O_RDWR 模式。 另一个进程 B 正在从该管道中连续读取。它已在 O_NONBLOCK | 中打开它。 O_RDONLY 模式。

请注意,我使用 boost::asio::posix::stream_descriptor 和 async_write (进程 A)和 async_read (进程 B)来完成这一切。

现在我的问题是 B 无法从管道中读取数据,直到 A 停止写入。我希望这一切同时发生。 B 的读取能力应该只取决于数据是否存在。应该不会受到A写的影响吧。

我怎样才能做到这一点?

我尝试更改打开文件描述符的模式,但无济于事。 我还尝试设置stream_descriptor.non_blocking(true);

编辑:我使用

从进程A中生成进程B
system(command.c_str());

命令保存可执行路径。此外,该过程是在后台执行的。所以我在以下情况下登录到标准输出:

  1. 进程A调用async_write(之前);
  2. 进程A调用了async_write(之后);
  3. 进程 async_write 完成处理程序执行(在其内部);

同样:

  1. 进程B,async_read被调用(之前);
  2. 进程B,async_read已被调用(之后);
  3. 进程 B 的 async_read 完成处理程序执行(在其内部)。

我观察到的输出:
B 异步读取调用
B 异步读取称为
异步写入调用
名为
的异步写入 异步写入完成
异步写入调用
名为
的异步写入 异步写入完成




B 异步读取完成
B 异步读取调用
B 异步读取称为



c++ linux boost-asio ipc named-pipes
1个回答
0
投票

编辑:我使用

从进程 A 中生成进程 B

系统(命令.c_str());

您可能会惊讶地发现,

system()
在返回之前等待执行的命令完成,并且只有到那时此程序才会继续运行。无论如何,这与命名管道无关。无论两个进程正在做什么,您都会做出相同的观察:进程 B 必须在进程 A 继续之前完成。

因为这就是

system
所做的。如果您回去查看教科书对
system()
的描述,您会发现
system()
返回生成程序的退出代码。好吧,要做到这一点,你必须等到它运行完成,不是吗?

您只需将

system()
替换为
fork()
exec()

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.