在重定向的stdout管道上禁用缓冲(Win32 API,C ++)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在重定向的stdout管道上禁用缓冲(Win32 API,C ++)相关的知识,希望对你有一定的参考价值。

我使用CreateProcess从Win32产生一个进程,将hStdOutputhStdErrorSTARTUPINFO属性设置为使用CreatePipe创建的管道句柄。我有两个线程读取管道,等待数据可用(或完成的过程,此时它检查在终止线程之前没有剩余数据)。 随着数据变得可用,我将输出写入有效的大文本框。

正在发生的事情是输出被缓冲,因此缓慢运行的进程只会在文本框中抛出大量数据,但不会“发生”。

我不确定它是否正在进行缓冲管道,或者与重定向有关。

有没有办法将管道设置为无缓冲,或者以尽快发送stdout的方式启动进程?

我正在使用一个测试应用程序进行测试

Here is line one
(waits one second)
Here is line two
(waits one second)
... etc
答案

缓冲可能在C运行时(printf等),你可以做的很少(IIRC它做一个isatty()检查来确定一个缓冲策略)

另一答案

SetNamedPipeHandleState,但它只控制远程管道的缓冲,而不是两端都在同一台计算机上。

另一答案

在我看来,你可以解决问题,如果你设置hStdOutputhStdErrorSTARTUPINFO不是用CreatePipe创建的管道句柄,而是你创建一个命名管道(使用CallNamedPipe函数完全像你之前使用的那样,如果之前也使用SECURITY_ATTRIBUTES与bInheritHandle = TRUE,参见http://msdn.microsoft.com/en-us/library/aa365782.aspx)然后使用CreateFile旗子在FILE_FLAG_WRITE_THROUGH的名字打开那里。就像你可以在MSDN(http://msdn.microsoft.com/en-us/library/aa365592.aspx)上阅读:

管道客户端可以使用CreateFile通过指定FILE_FLAG_OVERLAPPED来启用重叠模式,或通过指定FILE_FLAG_WRITE_THROUGH来启用直写模式。

因此,只需使用CreateFile标志重新打开FILE_FLAG_WRITE_THROUGH的管道,并将手柄/手柄设置为hStdOutputhStdErrorSTARTUPINFO

以上是关于在重定向的stdout管道上禁用缓冲(Win32 API,C ++)的主要内容,如果未能解决你的问题,请参考以下文章

在管道中强制标准输出的行缓冲

在win32中重定向标准输出不会重定向标准输出

如何使用 PHP 在重定向页面上使用 Google Analytics 进行跟踪?

命令输出(stdout,stderr)未重定向到管道

禁用输出缓冲

将子进程的 stdout 和 stderr 重定向到两个命名管道(然后从它们读回)