2017-03-27 1 views
4

Sprache: C, Betriebssystem: Linuxprintf newline hat Zeilenpuffer?

Code:

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 

int main(void) 
{ 
    fork(); 
    printf("hello world\n"); 
    fork(); 
    printf("bye\n"); 
    return 0; 
} 

Ausgang:

hello world 
bye 
hello world 
bye 
hello world 
bye 
hello world 
bye 

Nach this und this, printf() buffers output until a newline is encountered.

Also warum haben wir 4 "Hallo Welt" in diesem Fall? (Statt 2 „Hallo Welt“)

bearbeiten: Leider alle, aber wie @GregHewgill sagte ich dieses Programm aus einer Umgebung ausgeführt wird, wo der Ausgang nicht direkt an das Terminal sein kann, wenn ich es noch einmal überprüfen auf meinem Computer, es läuft nur wie erwartet.

+0

Die Ausgabe kann nicht reproduziert werden (gcc 4.8.1). – DyZ

+1

Zeilenpufferung ist nur eine * mögliche * Strategie, die 'printf' implementieren kann. Der einzige sichere Weg, um einen Ausgabestrom zu spülen, ist 'fflush'. – StoryTeller

+0

Ich bekomme unterschiedliche Ausgabe mit i686-pc-cygwin/3.4.4 in cygwin – cleblanc

Antwort

2

Gemäß diesem und diesem puffert printf() die Ausgabe, bis ein Zeilenumbruch auftritt.

Das Drucken eines Zeilenumbaus wird normalerweise nur dann geleert, wenn der Ausgang an ein Terminalgerät geht. Zum Beispiel:

$ ./a.out >out_file 

die Puffer auch mit den Newline-Zeichen nicht spülen. Also, deine Erwartung ist fehlerhaft.

der einzig richtige Weg, um Ausgang "gewünschte" (2 hello world und 4 bye) entweder zu deaktivieren Pufferung völlig setbuf Verwendung:

setbuf(stdout, 0); 

oder verwendet fflush:

fflush(stdout); 

nach jedem printf Aufruf explizit zu leeren.

+0

Es sollte ausreichen, um sicherzustellen, dass der Stream liniengepuffert ist, was über 'setvbuf()' erfolgen kann. Es sollte nicht notwendig sein, die Pufferung vollständig zu deaktivieren, obwohl das vielleicht sicherer wäre. –