2016-05-10 12 views

Antwort

3

Die Standardausgabe ist standardmäßig gepuffert, dh printf("u"), wird nur "u" in den Puffer gesetzt, bis ein fflush oder ein neues Zeilenzeichen angezeigt wird. Um die Ausgabe, um zu sehen, versuchen Sie dies:

printf("u"); 
fflush(stdout); 
write(STDOUT_FILENO, "m", 1); 
printf("d\n"); 
+0

Nein, stdout nicht Zeile gepuffert. * Wenn * einem Terminal zugeordnet ist, wird es standardmäßig gepuffert. Wenn es mit einer Pipe oder einer regulären Datei verknüpft ist, ist es höchstwahrscheinlich nicht. –

+0

@WilliamPurell Können Sie die Referenz davon zeigen? – fluter

+0

http://man7.org/linux/man-pages/man3/setbuf.3.html –

2

printf stores "u" in einem Puffer. write schreibt Daten in den zugrunde liegenden Dateidescritor. Der nächste printf setzt "d \ n" in den Puffer. Zu irgendeinem Zeitpunkt in der Zukunft (entweder wenn das Programm beendet wird oder wenn Sie printf genug aufrufen, dass der Puffer voll ist), wird der Puffer in den zugrunde liegenden Dateideskriptor geschrieben.

1

Die Ausgabe über die Standard-C-Ströme wird gepuffert. Der erste Aufruf an printf gespeichert u in den Puffer, während die zweite Zeile eine m direkt an die Standard-Ausgabedatei Handle des Systems über die write Systemaufruf, schließlich der zweite Aufruf an printf speichert d und einen Zeilenvorschub in den Puffer und spült die puffern zum System-Standard-Ausgabehandle, entweder weil die Ausgabe liniengepuffert ist (was normalerweise der Standardwert ist, wenn FILE* mit einem Terminal verbunden ist) und \n den Flush verursacht oder weil der Stream bei Programm-normaler Beendigung geleert wird.

stderr ist standardmäßig ungepufferte, versuchen Sie dies:

fprintf(stderr, "u"); 
write(STDERR_FILENO, "m", 1); 
fprintf(stderr, "d\n"); 
+0

Wo ist das "Terminal" in dieser Frage? Stoppen Sie die Verbindung von stdout mit einem tty. –

+0

@WilliamPursell: Ich stimme zu, ich habe die Antwort geändert, um genauer zu sein. – chqrlie