【发布时间】:2018-05-13 10:23:04
【问题描述】:
我正在尝试控制和读取第 3 方控制台应用程序的输出,我无法更改其源代码。
我想为此使用 QProcess,但这无关紧要,因为仅使用 cmd 时问题是相同的: 第 3 方应用程序似乎从不调用 flush()。 因此,直接在 cmd.exe 中调用它可以正常工作(输出出现在 cmd 窗口中),但是在调用时例如
3rdPartyApp.exe > Output.txt
Output.txt 保持为空,直到 3rdPartyApp.exe 终止或退出。 3rdPartyApp.exe退出或终止后,所有stdout都可以在Output.txt中找到。
问题: 如何创建一个管道缓冲区大小受限的环境,比如直接在cmd.exe中调用时,似乎将缓冲区大小限制为一行?
【问题讨论】:
-
如果应用程序没有设置使用行缓冲或不缓冲,则没有简单的解决方法。照原样,应用程序检测到 stdout 是一个管道并切换到完全缓冲,这通常使用 4 KB 缓冲区。
-
顺便说一句,它不是“cmd 窗口”,而且您没有“在 cmd”中运行应用程序。这是一个“控制台窗口”(由 conhost.exe 托管),您正在“从 cmd”运行应用程序。控制台应用程序继承父级控制台,或者如果父级没有控制台或通过
CREATE_NEW_CONSOLE创建标志指示它分配一个新控制台。
标签: windows cmd pipe stdout qprocess