如何在不阻塞或轮询的情况下从子进程'STDOUT接收输出

时间:2010-09-07 17:23:22

标签: c++ windows pipe parent-child

我有一个长期运行的基于控制台的应用程序Sender,它使用非缓冲输出(如cout << "Message" << flush())将简单文本发送到STDOUT。我想创建一个基于MFC对话框的应用程序(名为Receiver),它启动Sender并可以读取它的输出。 Receiver也应该能够检测Sender何时死亡,或者能够在Sender找到SenderRecieverSender一无所知,我也无法更改Sender的代码。

我的第一次尝试是为子进程创建带有重定向STDIN和STDOUT的管道,并使用异步ReadFileEx调用来读入Receiver的数据。这项工作无效,I've posted a separate thread关于这些具体问题。

我的问题是,在一般的架构术语中,我该怎么做?我不希望{{1}}的主循环阻止或轮询,但应该使用Wait function的某种风格。

1 个答案:

答案 0 :(得分:2)

您有2个基本选项。你已经尝试过的选项1,从子进程读取/写入异步(也就是非阻塞)IO。选项2是在Receiver进程中创建一个单独的线程,阻止对子进程的读/写。

我建议选项2,我觉得它更容易。当然,您遇到了如何从辅助线程获取数据到主线程的问题。你需要使用锁和信号量。然而,它应该比非阻塞IO更麻烦。

相关问题