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

标签 c++ windows pipe parent-child

我有一个长期运行的基于控制台的应用程序 Sender使用非缓冲输出将简单文本发送到 STDOUT,例如 cout << "Message" << flush() .我想创建一个基于 MFC 对话框的应用程序(名为 Receiver ),该应用程序启动 Sender并且可以读取它的输出。 Receiver也应该能够检测到何时 Sender已经死了,还是能杀Sender如果它愿意的话。 SenderReciever一无所知,我无法更改 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/

相关文章:

c++ - 创建一个由链接平衡 bst 和双向链表组成的数据结构

c++ - 如何正确处理带有指针的对象的按值返回?

c++ - 实例化对象和对象成员

c++ - 查找带权无向图中一定长度的所有路径

c++ - 使用命名管道的应用程序中的空输出

windows - 在此 AWS CLI 命令中,为什么使用 --exclude 和 --include 通配符复制文件不起作用?

php - Windows 上的 FFmpeg - 后台转换

PHP 4 和 5、Ctrl-C、system() 和子进程

Python pipe.send() 在 Mac OS 上挂起

powershell - PowerShell,如何提供管道变量?