Как работает printf () (или пишет в стандартный вывод) в отношении управления потоком и буферизации?Гарантированно ли printf () будет возвращаться в разумные сроки или будет блокироваться до тех пор, пока он фактически не сможет что-то записать на стандартный вывод?
Я думаю о медленном соединении SSH или о чем-то подобном.Может ли это на самом деле замедлить некоторые программы в printf ()?Произойдет ли это немедленно или только после заполнения некоторого буфера (некоторого внутреннего буфера stdout или, возможно, даже буфера отправки TCP)?Имеет ли использование SSH какую-то другую разницу, помимо возможного увеличения задержки и уменьшения скорости вывода?
Если да, то как это обойти?Являются ли потоки распространенным решением этой проблемы, или есть более простой способ установить флаг или выполнить вызов для переключения стандартного вывода в «неблокирующий режим»?Или у меня есть некоторые базовые факты о том, как работает ввод / вывод Unix совершенно неправильно, и этот вопрос не имеет никакого смысла?:)
Я спрашиваю, в основном, из интереса, но проблема недавно возникла в двух случаях во время экспериментов с C и оболочкой, и мне интересно, где и как это следует решать в целом:
При разработке приложения, которое потенциально может выводить много данных на терминал для отладки или в информационных целях, могут ли медленные терминалы потенциально вызывать проблемы с производительностью?Должен ли я (как программист) избегать конструкций, подобных (для каждого x в y: print y) для больших списков?
Или это проблема, которую лучше всего решать пользователю приложениявместо разработчика, перенаправив вывод в файл и т. д.?Если это так, есть ли полезные идиомы оболочки для отделения вывода программы от фактического выполнения, например mytool | cat
(я не уверен, что этот конкретный пример действительно что-то изменит, но cat может быть заменен чем-то более сложным).