Некоторые вещи, которые нужно иметь в виду:
1) Джон прав: если лимит буфера достигнут, вызов записи в вашем подпроцессе будет заблокирован. Вам нужно слить поток stdout, если он не перенаправлен куда-либо, что приведет к его автоматическому сбою - как файл. Трубы необходимо слить, и, как правило, если вы можете «прикрепить» к выходу подпроцесса, вы присоединяете к трубе.
2) I / O для выходного потока буферизуется , вероятно , что означает, что если подпроцесс записывает некоторую информацию в стандартный вывод без явного вызова flush()
, что почти всегда так, вы можете не вижу выхода. Flush вызывается автоматически при выходе из процесса, поэтому, если это небольшой небольшой подпроцесс, у вас должно быть все в порядке, но если это не так, у вас нет реального способа заставить его вывод отображаться, когда вы этого хотите.
3) Именованные каналы - это, по сути, буфер, поддерживаемый ОС, который можно записывать и читать из него, то есть они похожи на файл, в который вы можете записывать из одного процесса и читать из другого, фактически не имея накладные расходы на наличие файла на диске. Очень удобно для связи между процессами, но все ограничения ввода-вывода с буферизацией / полными буферами все еще применяются.