Будет ли процесс записывать данные в блок канала, если канал заполнен?

В настоящее время я погружаюсь в 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 ждать, пока процесс не выйдет. Будет ли процесс завершаться, если он превысит размер буфера стандартного выходного канала?

1 ответ

Решение

WaitForSingleObject на процесс с перенаправленным выводом действительно тупик. Вы должны оставить выходной канал пустым, чтобы дочерний процесс мог завершиться.

Обычно вы используете перекрывающий ввод / вывод на канале, а затем WaitForMultipleObjects на паре дескрипторов1 (дескриптор процесса, дескриптор события чтения канала) в цикле, пока дескриптор процесса не станет сигнальным.

Раймонд Чен написал о сценарии, когда ввод также передается по каналу:


1 Как прокомментировал Ганс, может быть более одного выходного потока. stdout, stderr типично, еще больше возможно через наследование дескриптора. Слейте все трубы, выходящие из процесса.

Другие вопросы по тегам