В чем разница между stdout и stderr в C? - PullRequest
0 голосов
/ 18 января 2020

In C, stdout и stderr по умолчанию печатаются в окне консоли. Есть ли разница между stderr и stdout, кроме уровня буферизации?

Ответы [ 3 ]

2 голосов
/ 06 марта 2020

Одним из различий между stdout и stderr является уровень буферизации. В §7.21.3 файлах *7 стандарт C11 гласит:

При запуске программы три текстовых потока предопределены и не требуют явного открытия - стандартный ввод (для чтение обычного ввода), стандартный вывод (для записи обычного вывода) и стандартная ошибка (для записи диагностики c вывода). При первоначальном открытии стандартный поток ошибок не полностью буферизован; стандартные входные и стандартные выходные потоки полностью буферизуются в том и только в том случае, если можно определить, что поток не относится к интерактивному устройству.

Как правило, это означает, что стандартный вывод является линейной буферизацией (поэтому данные сбрасывается при печати новой строки или при заполнении буфера), тогда как стандартной ошибкой является либо буферизация строки, либо небуферизация. Разумеется, эти характеристики можно изменить.

Целью стандартного потока ошибок является отделение сообщений об ошибках от обычного вывода. Это важно в таких контекстах, как сценарии оболочки, где стандартный вывод может быть отправлен в канал или в файл. Это перенаправление оставляет стандартную ошибку по-прежнему в другом месте - обычно это терминал. Вы также можете захватить стандартный вывод отдельно от стандартной ошибки, по крайней мере, если оболочка достаточно мощная.

 program > file
 program | filter
 program 2> error.log | filter
 program > file 2> error.log
 program 2> error.log

Первые два оставляют сообщения об ошибках видимыми на терминале. Последние три фиксируют сообщения об ошибках в файле error.log - отправка стандартного вывода в программу filter, file или в окно терминала соответственно.

Путем отделения сообщений об ошибках от стандартного выводим, что программы по конвейеру (filter в моем примере) не должны интерпретировать сообщения об ошибках от program, что делает их намного, намного проще.

1 голос
/ 06 марта 2020

Если программа запускается из консоли, или через командный файл, или через ярлык, используйте> или 1>, чтобы перенаправить стандартный вывод в файл, и 2>, чтобы перенаправить stderr в файл. Например, если вы читаете из stdin и пишете в stdout и stderr:

myprog <input.txt >output.txt 2>error.txt

или если вы хотите использовать stdout для файла, но stderr для отображения на экране, используйте:

myprog <input.txt >output.txt
0 голосов
/ 18 января 2020

stderr это - хорошо - место для ошибок. Это действительно полезно. Как и make - если код возврата программы не равен 0 (он завершен с ошибками), он напечатает stderr. stderr не может быть дифференцировано от stdout пользователем, но это все еще рекомендуемое место для ошибок. Однако, если ваша программа будет запускаться любой программой автоматизации, shell script et c ..., она может использоваться для отслеживания ошибок, а всегда использует ее.

...