Можно ли вызвать блок printf ()? - PullRequest
3 голосов
/ 14 декабря 2011

Как работает printf () (или пишет в стандартный вывод) в отношении управления потоком и буферизации?Гарантированно ли printf () будет возвращаться в разумные сроки или будет блокироваться до тех пор, пока он фактически не сможет что-то записать на стандартный вывод?

Я думаю о медленном соединении SSH или о чем-то подобном.Может ли это на самом деле замедлить некоторые программы в printf ()?Произойдет ли это немедленно или только после заполнения некоторого буфера (некоторого внутреннего буфера stdout или, возможно, даже буфера отправки TCP)?Имеет ли использование SSH какую-то другую разницу, помимо возможного увеличения задержки и уменьшения скорости вывода?

Если да, то как это обойти?Являются ли потоки распространенным решением этой проблемы, или есть более простой способ установить флаг или выполнить вызов для переключения стандартного вывода в «неблокирующий режим»?Или у меня есть некоторые базовые факты о том, как работает ввод / вывод Unix совершенно неправильно, и этот вопрос не имеет никакого смысла?:)

Я спрашиваю, в основном, из интереса, но проблема недавно возникла в двух случаях во время экспериментов с C и оболочкой, и мне интересно, где и как это следует решать в целом:

  • При разработке приложения, которое потенциально может выводить много данных на терминал для отладки или в информационных целях, могут ли медленные терминалы потенциально вызывать проблемы с производительностью?Должен ли я (как программист) избегать конструкций, подобных (для каждого x в y: print y) для больших списков?

  • Или это проблема, которую лучше всего решать пользователю приложениявместо разработчика, перенаправив вывод в файл и т. д.?Если это так, есть ли полезные идиомы оболочки для отделения вывода программы от фактического выполнения, например mytool | cat (я не уверен, что этот конкретный пример действительно что-то изменит, но cat может быть заменен чем-то более сложным).

1 Ответ

3 голосов
/ 14 декабря 2011

Да, звонки на printf() могут блокироваться.Одним из примеров является stdout, подключенный к каналу с медленным считывателем на другом конце.

Является ли это проблемой или как ее лучше смягчить, зависит от природы приложения, и почему это проблема в первую очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...