Hi,
ich bin gerade dabei eine kleine Client Server Anwendung zu schreiben, die ueber Sockets komuniziert.
Da ich auf dem Server einige "Langlaeufer" Job's starten moechte, wollte ich in der Zeit in der der Job laeuft dem Client eine "Fortschritsanzeige" spendieren, die einfach daraus besteht, das jede Sekunde ein Punkt geschrieben wird. Jedenfalls moechte ich so den Eindruck vermeiden das die Anwendung "eingefroren" ist.
Auf
Permonks habe ich folgendes gefunden:
Perl does not support truly unbuffered output (except insofar as you can syswrite(OUT, $char, 1)).
leider funktioniert das nicht so wie ich's mir gedacht habe. Die Punkte werden erst an den Client uebertragen wenn der Job fertig ist (wenn ich den newline sende). Weiter unten auf dieser Web Seite ist ein Beispiel fuer Sockets, hier wird jedoch wieder print anstelle von syswrite verwendet, ausserdem wird hier wieder expliziet ein Newline an den String angehaengt, was ich eben vermeiden moechte, wenn's denn ueberhaupt moeglich ist? Hier mein Code.
$|=1; # $OUTPUT_AUTOFLUSH, 0 Puffert einige Zeichen, !=0 schreibt direkt
$sock->autoflush();
my $kid;
# Quelle: http://www.unix.org.ua/orelly/perl/cookbook/ch16_10.htm
my $pid = open3(*HIS_IN, *HIS_OUT, *HIS_ERR, $job) or die "Fehler in open3 $!\n";
print $sock "Warte das der Prozess $job mit $pid beendet wird\n";
do {
sleep(1);
#print $sock ".";
syswrite($sock, ".", 1);
$kid = waitpid($pid, WNOHANG);
} until $kid != 0;
print $sock "\n";
Ich verstehe "unbuffered output" halt nicht so, das ich nach jedem Zeichen ein newline senden muss. Habe ich die Doku hier falsch verstanden, und es geht doch nicht, oder mache ich einen Fehler?
Roland
--
"Steh vorn, während du fragst;
sitzen soll, wer antwortet."
Aus "Die Edda des Snorri Sturluson" "Gylfis Täuschung" Strophe 2