我有一个进程 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中生成进程Bsystem(command.c_str());
命令保存可执行路径。此外,该过程是在后台执行的。所以我在以下情况下登录到标准输出:
同样:
我观察到的输出:
B 异步读取调用
B 异步读取称为
异步写入调用
名为
的异步写入
异步写入完成
异步写入调用
名为
的异步写入
异步写入完成
。
。
。
B 异步读取完成
B 异步读取调用
B 异步读取称为
。
。
。
编辑:我使用
从进程 A 中生成进程 B系统(命令.c_str());
您可能会惊讶地发现,
system()
在返回之前等待执行的命令完成,并且只有到那时此程序才会继续运行。无论如何,这与命名管道无关。无论两个进程正在做什么,您都会做出相同的观察:进程 B 必须在进程 A 继续之前完成。
因为这就是
system
所做的。如果您回去查看教科书对 system()
的描述,您会发现 system()
返回生成程序的退出代码。好吧,要做到这一点,你必须等到它运行完成,不是吗?
您只需将
system()
替换为 fork()
和 exec()
。