Thread Ausgabe "realtime" auslesen (7 answers)
Opened by aedu0 at 2006-03-28 23:15

Dubu
 2006-04-04 12:55
#64146 #64146
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Setze in Skript 1 vor der Schleife
Code: (dl )
$| = 1;

Dann klappt es.


Etwas zum Hintergrund:

Dass die Variable $| das Puffern der Ausgabe steuert, dürfte den meisten klar sein. Unklar ist aber vielleicht, warum obiges Skript1 auf der Kommandozeile auch ohne Änderungen an $| schön jede Sekunde eine Zeile ausgibt, das aber nicht mehr klappt, wenn es von Skript2 aufgerufen wird!
Die Std-Lib versucht hier besonders schlau zu sein: Wenn eine Ausgabe nicht auf STDERR erfolgt und das Ziel ein Terminal  ist, dann wird die Ausgabe zeilenweise gepuffert. Wenn das Ziel aber eine Datei oder Pipe ist, dann wird blockweise gepuffert.

Auch ohne das zweite Skript kann man den Unterschied leicht überprüfen. Man rufe das unveränderte Skript 1 einmal direkt auf:
Code: (dl )
$ ./skript1.pl

und dann zum Vergleich durch more gepipet:
Code: (dl )
$ ./skript1.pl | more

Beim zweiten Aufruf erscheinen auch erst alle zehn Zeilen zum Schluss.

Unter C ist es übrigens nicht viel anders als in Perl: Wenn man auch in einer Pipe jede Zeile sofort sehen möchte, sollte man beizeiten ein fflush() aufrufen. (Oder mit dem Flag O_DIRECT öffnen, was aber langsamer ist, weil dann nach jeder Ein-/Ausgabe geflusht wird.)

View full thread Ausgabe "realtime" auslesen