我有一个长期运行的基于控制台的应用程序 Sender
使用非缓冲输出将简单文本发送到 STDOUT,例如 cout << "Message" << flush()
.我想创建一个基于 MFC 对话框的应用程序(名为 Receiver
),该应用程序启动 Sender
并且可以读取它的输出。 Receiver
也应该能够检测到何时 Sender
已经死了,还是能杀Sender
如果它愿意的话。 Sender
对Reciever
一无所知,我无法更改 Sender
的代码。
我的第一次尝试是为子进程创建带有重定向 STDIN 和 STDOUT 的管道,并使用异步 ReadFileEx 调用读入 Sender
的数据。这无法正常工作,并且 I've posted a separate thread关于那些具体问题。
我的问题是,在一般的架构术语中,我应该如何做到这一点?我不要 Receiver
的主循环来阻止或轮询,但应该使用一些 Wait function 的风格.
最佳答案
您有 2 个基本选项。您已经尝试过的选项 1,执行异步(又名非阻塞)IO 以从子进程读取/写入。选项 2 是在 Receiver 进程中创建一个单独的线程来阻止对子进程的读/写。
我推荐选项 2,我发现它更容易。然后,您当然会遇到如何将数据从辅助线程获取到主线程的问题。为此,您需要使用锁,也许还需要使用信号量。但是,它应该比非阻塞 IO 更麻烦。
关于c++ - 如何在不阻塞或轮询的情况下从子进程的 STDOUT 接收输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3661041/