Der Code lautet wie folgt:C - Standardausgabe der Druckreihenfolge
printf("u");
write(STDOUT_FILENO, "m", 1);
printf("d\n");
Ausgabe: Schlamm
Kann mir jemand erklären, warum die Ausgabe in dieser Reihenfolge gedruckt wird?
Der Code lautet wie folgt:C - Standardausgabe der Druckreihenfolge
printf("u");
write(STDOUT_FILENO, "m", 1);
printf("d\n");
Ausgabe: Schlamm
Kann mir jemand erklären, warum die Ausgabe in dieser Reihenfolge gedruckt wird?
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");
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.
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");
Wo ist das "Terminal" in dieser Frage? Stoppen Sie die Verbindung von stdout mit einem tty. –
@WilliamPursell: Ich stimme zu, ich habe die Antwort geändert, um genauer zu sein. – chqrlie
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. –
@WilliamPurell Können Sie die Referenz davon zeigen? – fluter
http://man7.org/linux/man-pages/man3/setbuf.3.html –