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

问题描述 投票:13回答:3

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

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

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

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

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

Here is line one
(waits one second)
Here is line two
(waits one second)
... etc
windows winapi redirect stdout
3个回答
4
投票

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


0
投票

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


0
投票

在我看来,你可以解决问题,如果你设置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

© www.soinside.com 2019 - 2024. All rights reserved.