Я в настоящее время погружаюсь в API Win32 и пишу сам класс-оболочку для CreateProcess
и CreatePipe
. Мне просто интересно, что произойдет, если процесс, который я открыл, создает слишком большой вывод для хранения буфера. Будет ли процесс ждать, пока я не прочитаю с другого конца трубы? Замечание функции CreatePipe
предполагает, таким образом:Будет ли процесс записываться в блок трубы, если труба заполнена?
Когда процесс использует WriteFile для записи анонимной трубы, операция записи не завершена, пока все байты не будут записаны. Если буфер буфера заполнен до того, как все байты будут записаны, WriteFile не вернется, пока другой процесс или поток не использует ReadFile, чтобы сделать больше доступного пространства для буфера.
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365152%28v=vs.85%29.aspx
Давайте предположим, что я открываю процесс с CreateProcess
, а затем использовать WaitForSingleObject
подождать, пока процесс не завершит работу. Будет ли процесс когда-либо выходить, если он превышает размер буфера его стандартного выходного канала?
Если в официальной ссылке указано, что функция «WriteFile» не возвращается до ... », это то же самое, что и ее блокировка. Итак, ответ заключается в том, что да, запись в полный канал будет заблокирована. Кстати, это стандартное поведение, например. POSIX (например, Linux или OSX). –
В системах POSIX это действительно то, что происходит: производитель блокируется, пока не будет места для записи. Например, когда вы делаете 'ls -R/| less', 'less' будет читать некоторые экраны текста, а затем блокировать' ls', пока пользователь не прокрутится вниз. Если пользователь убивает процесс чтения (например, выйдя из «меньше»), исходный процесс будет убит. Это может сэкономить массу бесполезных вычислений. – anol
«Не возвращает» == блок. Если вы не читаете перенаправленный вывод, то да, этот процесс, скорее всего, заторможен. Довольно стандартная ошибка - это дренаж stdout, но не stderr. Вам понадобится WaitForMultipleObjects() для всех трех ручек. –