Есть ли размер буфера, прикрепленный к stdout?

Я пытаюсь найти некоторую информацию о ограничениях данных, связанных с stdout в Windows. Я не могу найти информацию о MSDN.

  • Есть ли предел того, сколько данных можно записать в stdout? Если да, то что произойдет, если предел достигнут? Утеряны ли данные?

  • Если stdout перенаправляется (например, запустив процесс из .Net и используя свойство ProcessStartInfo.RedirectStandardOutput), это повлияет на то, сколько данных можно записать? Как я читаю из потока stdout в вызывающем процессе, это влияет на ограничения?

  • Связаны ли эти ограничения с именованными каналами?

Ответ 1

Это зависит от того, где это происходит - но да, если вы перенаправляете вывод в .NET, вы можете легко столкнуться с проблемами, если не прочитаете вывод. Когда буфер закончится, запись в stdout в дочернем процессе будет заблокирована. Одна общая причина тупика - это "родительский" процесс, ожидающий выхода "ребенка", а затем считывание вывода - это не будет работать, если ребенку нужен родительский элемент для чтения вывода, чтобы освободить буферное пространство.

.NET сделал это немного легче, разрешив управляемый событиями подход с Process.OutputDataReceived и Process.ErrorDataReceived. Это означает, что вам не нужно запускать два потока (один для чтения stdout, один для чтения stderr), чтобы блокировать процесс...

Ответ 2

Некоторые вещи, которые нужно иметь в виду:

1) Джон прав - если достигнут предел буфера, вызов записи в вашем подпроцессе будет блокироваться. Вам нужно слить поток stdout, если он не перенаправлен где-нибудь, что приведет к его автоматическому сливу - как к файлу. Трубы нужно осушать, и обычно, если вы можете "присоединить" к выходу подпроцесса, вы присоединяетесь к трубе.

2) Ввод-вывод в выходной поток, вероятно, буферизуется, что означает, что если подпроцесс записывает некоторую информацию в stdout без явного вызова flush(), что почти всегда происходит, вы можете не видеть вывод. Флеш автоматически вызывается, когда процесс завершается, поэтому, если это короткий небольшой подпроцесс, вы должны быть в порядке, но если это не так, у вас нет реального способа заставить его вывод отображаться, когда вы хотите его.

3) Именованные каналы по существу являются буфером, который поддерживает ОС, который может быть записано и прочитано, то есть они похожи на файл, который вы можете записать в один процесс, и читать из другого, без фактического накладные расходы на наличие файла на диске. Очень удобно для связи между процессами, но все ограничения ввода-вывода с буферизацией/полным буфером все еще применяются.

Ответ 3

stdout имеет буфер 1024 байта