我目前正在深入研究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
等待进程退出。如果进程超过其标准输出管道的缓冲区大小,它是否会退出?
答案 0 :(得分:3)
WaitForSingleObject
确实是一个死锁。您需要保持输出管道耗尽,以便让子进程运行完成。
通常,您将在管道上使用重叠I / O,然后在循环中使用句柄对 1 (进程句柄,管道读取事件句柄)上的WaitForMultipleObjects
,直到进程句柄变为信号通知。
Raymond Chen写了关于输入也是管道输入的情节:
1 正如Hans评论的那样,可以有多个输出流。 stdout
,stderr
是典型的,通过句柄继承可以实现更多。排出所有流出的管道。