在重定向的stdout管道上禁用缓冲(Win32 API,C ++)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在重定向的stdout管道上禁用缓冲(Win32 API,C ++)相关的知识,希望对你有一定的参考价值。
我使用CreateProcess
从Win32产生一个进程,将hStdOutput
的hStdError
和STARTUPINFO
属性设置为使用CreatePipe
创建的管道句柄。我有两个线程读取管道,等待数据可用(或完成的过程,此时它检查在终止线程之前没有剩余数据)。
随着数据变得可用,我将输出写入有效的大文本框。
正在发生的事情是输出被缓冲,因此缓慢运行的进程只会在文本框中抛出大量数据,但不会“发生”。
我不确定它是否正在进行缓冲管道,或者与重定向有关。
有没有办法将管道设置为无缓冲,或者以尽快发送stdout的方式启动进程?
我正在使用一个测试应用程序进行测试
Here is line one
(waits one second)
Here is line two
(waits one second)
... etc
缓冲可能在C运行时(printf等),你可以做的很少(IIRC它做一个isatty()检查来确定一个缓冲策略)
有SetNamedPipeHandleState,但它只控制远程管道的缓冲,而不是两端都在同一台计算机上。
在我看来,你可以解决问题,如果你设置hStdOutput
的hStdError
和STARTUPINFO
不是用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
的管道,并将手柄/手柄设置为hStdOutput
和hStdError
的STARTUPINFO
。
以上是关于在重定向的stdout管道上禁用缓冲(Win32 API,C ++)的主要内容,如果未能解决你的问题,请参考以下文章