LINUX.ORG.RU

История изменений

Исправление EXL, (текущая версия) :

Но видимо и тебе и futuram-е известно нечто большее, можете здесь об этом рассказать (я не стебусь если что).

Так я тут как раз и рассказал то, что знаю и считаю важным:

stdout является буферизированным потоком, поэтому при некоторых обстоятельствах, таких как вывод чего-либо в быстром цикле и т. д. – сообщения могут запаздывать или сбрасываться внутрь консоли лишь после закрытия программы или после выхода из функций и пр. С этим связано много проблем при отладочном выводе printf()’ами в различных окружениях. Потому опытные программисты всегда выплёвывают отладку в fprintf(stderr, ...), чтобы избежать этих side-эффектов и сэкономить кучу времени.

stderr не является буферизированным потоком, поэтому вывод каких-либо сообщений в stderr моментально выведет их на консоль, даже в ущерб той производительности, которая обеспечивается буфером.

В популярных UNIX-like консольных программах, в т. ч. и входящих в Base System разных Linux-дистрибутивов нет чёткой градации и стандартов, когда использовать stderr, а когда – stdout, все делают так как того пожелают.

К примеру, я не понимаю почему GCC по gcc -v выплёвывает версию в stderr, вместо более логичного для этого stdout и пр. подобные примеры.

$ gcc -v | grep unknown
# Вывод в stderr.
# Хрен тебе! Ковыряйся с пайпами, вспоминай `1>&2` или `2>&1` или ещё как.

$ ld -v | grep unknown
# Вывод в stdout.
# Всё работает как надо.

Исходная версия EXL, :

Но видимо и тебе и futuram-е известно нечто большее, можете здесь об этом рассказать (я не стебусь если что).

Так я тут как раз и рассказал то, что знаю и считаю важным:

stdout является буферизированным потоком, поэтому при некоторых обстоятельствах, таких как вывод чего-либо в быстром цикле и т. д. – сообщения могут запаздывать или сбрасываться внутрь консоли лишь после закрытия программы или после выхода из функций и пр. С этим связано много проблем при отладочном выводе printf()’ами в различных окружениях. Потому опытные программисты всегда выплёвывают отладку в fprintf(stderr, ...), чтобы избежать этих side-эффектов и сэкономить кучу времени.

stderr не является буферизированным потоком, поэтому вывод каких-либо сообщений в stderr моментально выведет их на консоль, даже в ущерб той производительности, которая обеспечивается буфером.

В популярных UNIX-like консольных программах, в т. ч. и входящих в Base System разных Linux-дистрибутивов нет чёткой градации и стандартов, когда использовать stderr, а когда – stdout, все делают так как того пожелают.

К примеру, я не понимаю почему GCC по gcc -v выплёвывает версию в stderr, вместо более логичного для этого stdout и пр. подобные примеры.

$ gcc -v | grep unknown
# А хрен тебе! Ковыряйся с пайпами, вспоминай `1>&2` или `2>&1` или ещё как.

$ ld -v | grep unknown
# Всё работает как надо.