如何限制管道(windows)的缓冲区大小?
Posted
技术标签:
【中文标题】如何限制管道(windows)的缓冲区大小?【英文标题】:How to limit the buffer size of a pipe (windows)? 【发布时间】: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
创建标志指示它分配一个新控制台。
【参考方案1】:
您可以做的是创建自己的控制台类型应用程序,该应用程序将运行第 3 方进程并“处理”它的缓冲。 然后重定向 3rd 方应用程序的输出,您只需重定向代理控制台应用程序的输出。
怎么做?你可以在这里阅读:https://www.codeproject.com/Articles/16163/Real-Time-Console-Output-Redirection
作者提供了解释并准备使用名为 RTConsole.exe 的控制台应用程序。
我在从 .NET 应用程序生成的第 3 方 pyhton 可执行文件中获得无缓冲输出时遇到了很大的问题,而这个 RTConsole.exe 救了我。
【讨论】:
以上是关于如何限制管道(windows)的缓冲区大小?的主要内容,如果未能解决你的问题,请参考以下文章