Существует ли размер буфера, присоединенный к stdout?

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

  1. Существует ли предел тому, сколько данных может быть записано в stdout? Если так, что происходит, если предел достигнут? Данные потеряны?

  2. Если stdout перенаправляется (например, путем запуска процесса от .NET и использования ProcessStartInfo. Свойство RedirectStandardOutput), который имеет какой-либо эффект на то, сколько данных может быть записано? Когда я читал из stdout потока в обработке вызовов, которая влияет на ограничения?

  3. Эти пределы связаны всегда с именованными каналами?

11
задан jameswelle 14 January 2010 в 17:48
поделиться

2 ответа

- [112074142-

Это зависит от того, где он собирается - но да, если вы перенаправляете вывод в .NET, вы можете легко столкнуться с проблемами, если вы не читаете вывод. Когда буфер заканчивается, пишет на STDOUT в дочернем процессе, будет блокировать. Одним из Common-Ish Touch Of Tootlock - это «родительский» процесс, ожидающий «ребенка» для выхода, а затем чтение вывода - это не будет работать, если ребенок нуждается в родительском языке, чтобы прочитать вывод, чтобы освободить буферное пространство.

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

19
ответ дан 3 December 2019 в 03:52
поделиться

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

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

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

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

4
ответ дан 3 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: