管道中的不完整消息连接到子进程的stdout

时间:2015-04-06 19:16:41

标签: c++ pipe posix readfile

我的应用程序中有父进程和子进程。

父计划每X ms查看一次管道,如果有任何内容则读取管道。内容基本上用在RPC中,这意味着父对象只不过是将消息传递给另一种类型的IPC。

这似乎有效,孩子产生的输出延迟非常接近100毫秒,并且远程程序被调用。

但有时候,父进程似乎得到一条不完整的消息,好像该子进程正在父进程尝试读取的同时进行写入。这种情况每分钟发生几次。 这是预期的吗?

我知道所有邮件都以特定字符结尾'}',我正在发送JSON。在阅读之前,我应该偷看并确保我有这个角色。 (我还没有这样做,因为这样做会将父母的体系结构从哑巴消息传递网关改为使用"消息检查")。

我正在使用Posix write()read(),例如here。将O_NONBLOCK设置为here

我已经使管道无阻塞,因为我从孩子那里不断获取数据,但我无法阻止我的主要应用程序。

如果我需要实现对消息内容的检查,我可能也有可能我在同一个read()中获得多个消息以及多个消息的实现处理,也许我可以拆分收到的消息'}'并传递每条消息进行处理。

1 个答案:

答案 0 :(得分:2)

管道是字符流,而不是消息流。无法保证管道将保留您的消息边界,因此读者有责任重新组装完整的消息。

这可以通过查找消息结束字符来完成(新行字符通常用于文本数据; EOT(0x04)或ETX(0x03)字符通常用于二进制数据。)

也可以通过在每条消息之前发送包含计数的标题来传达消息边界。