2011-11-09 14 views
6
#include<stdio.h> 
#include <unistd.h> 
int main(){ 
     while(1) 
     { 

       fprintf(stdout,"hello-out"); 
       fprintf(stderr,"hello-err"); 
       sleep(1); 
     } 
     return 0; 
} 

Podczas kompilacji tego programu w gcc i przy jego uruchomieniu drukowane są tylko błędy powitania i powitania. Dlaczego tak się dzieje? Czy ktoś może wyjaśnić przyczynę?dlaczego ten program c nie wydrukuje pierwszej instrukcji printf?

+0

Jaka jest Twoja platforma? –

+0

Gdzie wyglądałeś wydrukowany tekst? Najpierw 'printf' drukuje na' stdout' i na 'stderr'.W twoim przypadku mogą to być różne strumienie wyjściowe – Nekto

+0

@ JimBuck - Pracuję nad linkiem Fedory. – bornfree

Odpowiedz

17

Jeśli dodasz '\n' do wiadomości, będzie (lub powinien), tj. "hello-out\n".

Powodem jest to, że stdout jest buforowane aby być bardziej skuteczne, natomiast stderr nie bufor to moc i jest bardziej odpowiedni dla komunikatów o błędach i rzeczy, które muszą być wydrukowane bezpośrednio.

stdout będzie zwykle być zaczerwieniona gdy:

  • wiersza (\n) ma zostać wydrukowany
  • Czytasz z stdin
  • fflush() nazywa się na nim

EDYCJA: Inną rzeczą, którą chciałem dodać, zanim mój komputer się zawiesił ... dwa razy ... było to, że można również użyć buforowania , aby wyłączyć buforowanie stdout. Robiłem to wcześniej, kiedy musiałem używać write() (Unix) i nie chciałem, aby moje dane wyjściowe były buforowane.

+0

+1 dla setbuf (stdout, NULL) –

+1

Dzięki za wyjaśnienie! – bornfree

+0

@bornfree: nie martw się, mam nadzieję, że to wyjaśniłem. – AusCBloke

1

Nie pamiętasz znaków nowej linii (oznaczonych \n) w swoich ciągach znaków. Albo trzeba zadzwonić fflush(NULL); lub przynajmniej fflush(stdout); przed sleep(1);

I fprintf(stdout, ...) jest taka sama jak printf(...)

Musisz nowej linii wyjściowych lub zadzwonić fflush ponieważ (przynajmniej na Linuksie) bufor stdout FILE jest line- buforowany. Oznacza to, że biblioteka C buforuje dane i naprawdę wyprowadza je (używając write Linux system call), gdy bufor jest dostatecznie pełny, lub po spłukaniu go albo nową linią, albo przez wywołanie fflush. Buforowanie jest potrzebne, ponieważ wywołania systemowe są kosztowne (wywołanie write, ponieważ każdy bajt wyjściowy jest naprawdę zbyt wolny). Przeczytaj też stronę człowiekiem setbuf

+1

Czy możesz wyjaśnić, dlaczego jest to wymagane? Chcę zrozumieć przyczynę tego. – bornfree

+0

Odpowiedź AusCBloke wyjaśnia to. –

+0

, jak inni odpowiedzieli, ponieważ jest buforowany w celu zmniejszenia operacji wejścia/wyjścia. Wywołanie fflush() wymusiłoby przepłukanie bufora. – LeleDumbo

3

Nie zawsze wydrukować wyjście na stdout, ponieważ przez projekt jest buforowane wyjście stdout i stderr są buforowane. Ogólnie rzecz biorąc, dla zbuforowanego strumienia wyjściowego, strumień nie jest odrzucany, dopóki system nie będzie "wolny", aby to zrobić. Aby dane mogły być buforowane przez dłuższy czas, zanim zostaną przepłukane. Jeśli chcesz, aby wymusić bufor do płukania można to zrobić ręcznie przy użyciu fflush

#include<stdio.h> 
#include <unistd.h> 
int main(){ 
     while(1) 
     { 

       fprintf(stdout,"hello-out"); 
       fflush(stdout); /* force flush */ 
       fprintf(stderr,"hello-err"); 
       sleep(1); 
     } 
     return 0; 
} 

Aktualizacja: stdout jest linebuffered po podłączeniu do terminala, a po prostu buforowane inaczej (na przykład przekierowanie lub rura)

+0

Dzięki! Dostałem punkt. – bornfree

Powiązane problemy