Warum funktioniert printf() nicht alles drucken, bevor die sleep()?
Ich bin nur zu lernen, C mit Kernighan und Ritchie ' s Buch; ich bin in den Grundlagen des im vierten Kapitel (Funktionen und so). Den anderen Tag, wurde ich neugierig auf die sleep()
Funktion, so versucht es so zu benutzen:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf(" I like cows.");
sleep(5);
return 0;
}
Das problem ist die Ausgabe des Programms, es sieht wie die sleep()
zuerst und dann die printf()
, in anderen Worten, es wartet fünf Sekunden und druckt den string. Also dachte ich, vielleicht ist das Programm bekommt sleep()
so schnell, dass es nicht lassen printf()
habe seine Arbeit getan, wie ich wollen, ist, dass print den string und dann schlafen.
Wie kann ich den string und setzen Sie dann das Programm, um zu schlafen?
Der compiler ist GCC 3.3.5 (propolice) in OpenBSD 4.3.
PS ich weiß nicht, wie du hier den Präprozessor Zeilen korrekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
printf()
schreibtstdout
(der Standard-output-stream), die in der Regel Leitung gepuffert. Der buffer nicht geleert, indem die Zeitsleep
aufgerufen wird, so wird nichts angezeigt, beim beenden des Programms werden alle streams automatisch gespült, die ist, warum druckt es direkt vor dem beenden. Drucken Zeilenumbruch wird in der Regel die Ursache der stream geleert werden, alternativ könnte man diefflush
Funktion:oder:
Wenn Sie zum drucken einen stream nicht gepuffert ist, wie der Fall sein kann, wenn
stdout
umgeleitet werden, oder Sie werden in eine Datei schreiben, einfach drucken Zeilenumbruch wird wahrscheinlich nicht funktionieren. In solchen Fällen sollten Sie die Verwendungfflush
wenn Sie möchten, dass die Daten sofort geschrieben.fflush (stdout)
ist Undefiniertes Verhalten.Pufferung bedeutet, dass alle der Ausgang ist an einem Ort gespeichert (sogenannte Puffer) und wird ausgegeben, nachdem eine bestimmte Menge von Daten in Ihr gegenwärtig. Dies geschieht aus Gründen der Effizienz.
Einige (die meisten?) Implementierungen deaktivieren Sie den Puffer nach einem Zeilenumbruch beim schreiben in der Konsole, so dass Sie können auch versuchen
anstatt den Aufruf von fflush()
Dein problem ist, dass printf (und nichts anderes verwendet die stdio-Bibliothek zu schreiben auf stdout (standard-output)) wird gepuffert - line-buffered, wenn es geht um die Konsole, und die Größe der gepufferten wenn es geht eine Datei. Wenn Sie eine
fflush(stdout);
nach derprintf
, es wird tun, was Sie wollen. Sie könnten versuchen, nur das hinzufügen von einem newline ('\n') zu Ihrem string und das würde das richtige tun, solange Sie nicht umleiten der Standardausgabe in eine Datei.Bin ich mir nicht 100% sicher, aber ich glaube
stderr
ist nicht gepuffert, das kann zu Verwirrung führen, weil Sie vielleicht Ausgabe sehen Sie aufstderr
vor der Ausgabe, die Sie zuvor gemacht, umstdout
.Implementiert habe ich Zeit Begegnung wie folgt;