如果管道已满,进程是否会写入管道阻塞?
Will a process writing to a pipe block if the pipe is full?
我目前正在研究 Win32 API 并为自己编写一个 CreateProcess
和 CreatePipe
的包装器 class。我只是想知道如果我打开的进程写入太多输出以致管道缓冲区无法容纳会发生什么。这个过程会等到我从管道的另一端读取吗? CreatePipe
函数的备注表明:
When a process uses WriteFile to write to an anonymous pipe, the write operation is not completed until all bytes are written. If the pipe buffer is full before all bytes are written, WriteFile does not return until another process or thread uses ReadFile to make more buffer space available.
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365152%28v=vs.85%29.aspx
假设我使用 CreateProcess
打开一个进程,然后使用 WaitForSingleObject
等待进程退出。如果进程超过其标准输出管道的缓冲区大小,该进程是否会退出?
WaitForSingleObject
在具有重定向输出的进程上确实是一个死锁。您需要保持输出管道排空,以便让子进程 运行 完成。
通常你会在管道上使用重叠的I/O,然后在句柄对1(进程句柄,管道读取事件句柄)上使用WaitForMultipleObjects
一个循环,直到进程句柄发出信号。
Raymond Chen 写了关于输入也通过管道传输的场景:
1 正如汉斯评论的那样,可以有多个输出流。 stdout
, stderr
是典型的,通过句柄继承甚至更多。排空流程中的所有管道。
我目前正在研究 Win32 API 并为自己编写一个 CreateProcess
和 CreatePipe
的包装器 class。我只是想知道如果我打开的进程写入太多输出以致管道缓冲区无法容纳会发生什么。这个过程会等到我从管道的另一端读取吗? CreatePipe
函数的备注表明:
When a process uses WriteFile to write to an anonymous pipe, the write operation is not completed until all bytes are written. If the pipe buffer is full before all bytes are written, WriteFile does not return until another process or thread uses ReadFile to make more buffer space available.
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365152%28v=vs.85%29.aspx
假设我使用 CreateProcess
打开一个进程,然后使用 WaitForSingleObject
等待进程退出。如果进程超过其标准输出管道的缓冲区大小,该进程是否会退出?
WaitForSingleObject
在具有重定向输出的进程上确实是一个死锁。您需要保持输出管道排空,以便让子进程 运行 完成。
通常你会在管道上使用重叠的I/O,然后在句柄对1(进程句柄,管道读取事件句柄)上使用WaitForMultipleObjects
一个循环,直到进程句柄发出信号。
Raymond Chen 写了关于输入也通过管道传输的场景:
1 正如汉斯评论的那样,可以有多个输出流。 stdout
, stderr
是典型的,通过句柄继承甚至更多。排空流程中的所有管道。