如何限制管道(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)的缓冲区大小?的主要内容,如果未能解决你的问题,请参考以下文章

Linux管道缓冲区有多少数据? linux管道缓冲区大小可以配置吗?

通过命名管道发送数据包?单字节缓冲区还是预先确定大小的?

如何确保已读取所有管道缓冲区?

在 CentOS 上增加管道内部缓冲区大小

如何设置Windows默认命令行窗口大小和缓冲区大小

10.3 进程间通信--管道