winapi - 我可以单独捕获 stdout/stderr 并保持原始顺序吗?

标签 winapi stdout redirect stderr

我已经使用 native win32 API 编写了一个 Windows 应用程序。我的应用程序将启动其他进程并捕获输出并以红色突出显示 stderr 输出。

为了实现这一点,我为 stdout 和 stderr 创建了一个单独的管道,并在调用 CreateProcess 时在 STARTUPINFO 结构中使用它们。然后我为每个 stdout/stderr 句柄启动一个单独的线程,从管道读取并将输出记录到窗口。

这在大多数情况下工作正常。我遇到的问题是,如果子进程快速连续登录到 stderr 和 stdout,我的应用程序有时会以不正确的顺序显示输出。我假设这是由于使用两个线程从每个句柄读取。

是否可以按照写入的原始顺序捕获 stdout 和 stderr,同时能够区分两者?

最佳答案

我很确定这是不可能的,除了编写生成的程序以写入数据包并为每个数据包添加时间戳。没有它,您通常可以计划在子进程的标准库中进行缓冲,因此当它们甚至通过管道传输到父进程时,它们很有可能已经出现故障。

关于winapi - 我可以单独捕获 stdout/stderr 并保持原始顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1545619/

相关文章:

go - 为什么我在使用 stderr 和 ioutil.ReadAll 的 Go 程序中得到 "bad file descriptor"

c - Stdin with getc 产生额外的输出,并打开文件导致 C 中的段错误

http - 如何避免浏览器重定向缓存

c++ - 线程模拟的多级使用

windows - 私有(private)字节的 win32 API 函数是什么?

java - 从 python 到 java 的管道输入

php - 使用PHP进行跨域post数据

c++ windows通过USB串行获取USB端口和集线器

python - 如何在不包含主机环境的站点包文件夹的情况下将 pywin32 与 virtualenv 一起使用?

.htaccess - htaccess 重定向 "/?id=(.*)",但仅限于根目录?