2013-02-28 1 views
0

У меня есть этот код в моей программеWeird поведение STDERR

while(1){ 
    // some code here 

fprintf(stdout,"Output Log"); 
fprintf(stderr,"Error Log"); 


//some code here 
     } 

Он печатает только "Error Log". Похоже, что мне не хватало флеша между двумя fprintf. Поэтому я добавил «\ n» в строку «Выходной журнал». Отлично. Но не могу понять это странное поведение, когда я просто поменять местами два fprintf

while(1){ 
    // some code here 
fprintf(stderr,"Error Log\n"); 
fprintf(stdout,"Output Log");  

//some code here 
     } 

Inspite использования «\ п» это только печатает «журнал ошибок».

ответ

5

Ваша ошибка заключается в том, что новая строка «между» двумя сообщениями является тем, что заставляет их отображаться. На самом деле это новая строка в конце выхода к stdout, которая вызывает сообщение stdout (сообщение для stderr всегда видно, потому что stderr небуферировано).

В любом случае, полагаясь на новые строки для сброса буфера, это ненадежно, если вы не вручную настроили режим буферизации по строке на stdout; line-buffered - это только значение по умолчанию, когда stdout является терминалом. Если вы не хотите форсировать буферизованный или небуферизованный режим, то вы должны использовать fflush для получения надежного чередования вывода до stdout и stderr.

1

stderr является специальным. Он никогда не полностью буферизуется при запуске приложения, например stdout. Реализация зависит от того, буферизована ли она или нет, и она вообще не буферизована (как здесь кажется).

Не имеет значения, привязаны ли они к одному устройству вывода. Это имеет смысл, когда вы об этом думаете; вы, вероятно, хотите, чтобы ваши ошибки были сброшены так быстро, насколько это разумно.

1

Оказывается, stdout буферизуется, а stderr - нет. Так как программа никогда не заканчивается, буфер никогда не загорается.