如果管道已满,写入管道的进程是否会阻塞?

Nik*_*s R 4 c winapi pipe createprocess

我目前潜入的Win32 API,写我自己的包装类CreateProcessCreatePipe。我只是想知道如果我打开的进程为管道缓冲区写入过多的输出会发生什么。该过程会等到我从管道的另一端读取吗?该CreatePipe函数的备注表明:

当进程使用 WriteFile 写入匿名管道时,直到写入所有字节后,写入操作才会完成。如果在写入所有字节之前管道缓冲区已满,则 WriteFile 不会返回,直到另一个进程或线程使用 ReadFile 来提供更多可用缓冲区空间。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365152%28v=vs.85%29.aspx

让我们假设我打开一个进程CreateProcess,然后使用WaitForSingleObject等待进程退出。如果进程超过其标准输出管道的缓冲区大小,它会退出吗?

Ben*_*igt 5

WaitForSingleObject在具有重定向输出的进程上确实是一个死锁。您需要保持输出管道排空,以便让子进程运行完成。

通常,您会在管道上使用重叠 I/O,然后WaitForMultipleObjects在循环中的句柄对1(进程句柄、管道读取事件句柄)上使用重叠 I/O,直到进程句柄发出信号。

Raymond Chen 写到了输入也通过管道传输时的场景:


1正如 Hans 所评论的,可以有多个输出流。 stdout,stderr是典型的,通过句柄继承甚至可能更多。排空从过程中出来的所有管道。