Я пытаюсь найти некоторую информацию о пределах данных связанной с stdout в Windows. Я, может казаться, не нахожу информацию о MSDN.
Существует ли предел тому, сколько данных может быть записано в stdout? Если так, что происходит, если предел достигнут? Данные потеряны?
Если stdout перенаправляется (например, путем запуска процесса от .NET и использования ProcessStartInfo. Свойство RedirectStandardOutput), который имеет какой-либо эффект на то, сколько данных может быть записано? Когда я читал из stdout потока в обработке вызовов, которая влияет на ограничения?
Эти пределы связаны всегда с именованными каналами?
Это зависит от того, где он собирается - но да, если вы перенаправляете вывод в .NET, вы можете легко столкнуться с проблемами, если вы не читаете вывод. Когда буфер заканчивается, пишет на STDOUT в дочернем процессе, будет блокировать. Одним из Common-Ish Touch Of Tootlock - это «родительский» процесс, ожидающий «ребенка» для выхода, а затем чтение вывода - это не будет работать, если ребенок нуждается в родительском языке, чтобы прочитать вывод, чтобы освободить буферное пространство.
.NET сделала это немного проще, позволив к тому, что приводимый к событиям подход с процессом
.OutputDataReatived
и Process.errordatareCeived
. Это означает, что вам не нужно начать два потока (один, чтобы прочитать stdout, один, чтобы прочитать STDERR), просто чтобы сохранить процесс блокировки ...
Некоторые вещи, которые следует иметь в виду:
1) Джон прав - если лимит буфера будет достигнут, вызов записи в вашем подпроцессе будет заблокирован. Нужно сливать stdout-поток, если он не перенаправляется куда-то, что приведет к его автоматическому сливу - как файл. Трубы нужно сливать, и обычно, если вы можете "прикрепить" к выводу подпроцесса, то вы прикрепите его к трубе.
2) Выход в выходной поток буферизируется вероятно , что означает, что если подпроцесс записывает некоторую информацию в stdout без явного вызова flush()
, что почти всегда происходит, вы можете не увидеть вывод. Flush автоматически вызывается при выходе из процесса, так что если это короткий маленький подпроцесс, вы должны быть в порядке, но если это не так, то у вас нет реального способа заставить его вывод показываться, когда вы этого хотите.
3) Именованные каналы - это, по сути, буфер, поддерживаемый операционной системой, в который можно записывать и из которого можно читать - то есть, они похожи на файл, в который можно записывать из одного процесса и из которого можно читать из другого, не испытывая накладных расходов, связанных с наличием файла на диске. Очень удобно для связи между процессами, но все ограничения ввода/вывода с буферизацией / полными буферами все еще применяются.