我目前正在潜入Win32 API并编写自己的包装类CreateProcess
和CreatePipe
。我只是想知道如果我打开的进程为管道缓冲区写入太多输出,将会发生什么情况。这个过程是否会等到我从管道的另一端读取? CreatePipe
函数备注建议如此:如果管道已满,是否会写入管道块的进程?
当进程使用WriteFile写入匿名管道时,直到写入所有字节才完成写入操作。如果在写入所有字节之前管道缓冲区已满,则WriteFile将不会返回,直到其他进程或线程使用ReadFile来提供更多缓冲区空间。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365152%28v=vs.85%29.aspx
假设我开一个进程,CreateProcess
,然后用WaitForSingleObject
等到进程退出。如果超过标准输出管道的缓冲区大小,该进程是否会退出?
如果官方的参考文献说'WriteFile'函数“不会返回......”,它与阻塞相同。那么答案是,是写入一个完整的管道会阻塞。顺便说一句,它是例如POSIX系统(如Linux或OSX)也是如此。 –
在POSIX系统中,这确实发生了什么:生产者被阻塞,直到有空间写入。例如,当你做'ls -R/|时less“,'less'将读取文本的某些屏幕,然后阻止'ls',直到用户向下滚动。如果用户杀死读者进程(例如通过退出'less'),则原始进程将被终止。这可以节省大量无用的计算。 – anol
“不返回”==块。如果你不读取重定向输出,那么,这个过程很可能会陷入僵局。一个非常标准的错误是消耗stdout而不是stderr。您需要在所有3个句柄上使用WaitForMultipleObjects()。 –