gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:33:00 27 4
gpt4 key购买 nike

我目前正在深入研究 Win32 API 并为 CreateProcess 编写了一个包装类 |和 CreatePipe .我只是想知道如果我打开的进程为管道缓冲区写入过多的输出会发生什么。该过程会等到我从管道的另一端读取吗? 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,然后是 WaitForMultipleObjects在句柄pair1(进程句柄,管道读取事件句柄)上循环,直到进程句柄发出信号。

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

  • Be careful when redirecting both a process's stdin and stdout to pipes, for you can easily deadlock


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

    关于c - 如果管道已满,写入管道的进程是否会阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29852077/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com