Probleme mit Pipes
am 11.10.2006 20:49:06 von Maros KollarHallo!
hab eine Appliation die aus einem Parent und beliebig vielen Worker
Threads besteht. Es gibt für jeden Worker zwei Pipes (eine zum schreiben
von Nachrichten an den Parent und eine zum schreiben an den Worker - ich
verwende IO::Pipe).
Wenn besonders viel los ist passiert es dass sysread bzw flush
blockiert, das kann ich zwar mit Alarm abfangen, doch ein Pipe dass
einmal blockiert hat blockiert ab dem Zeitpunkt immer und ist nicht mehr
zu benutzen.
alarm(1);
local $SIG{'ALRM'} = sub { die "TIMEOUT"; };
eval {
$oPipe->syswrite($sMessage); <-- Hier geht nix mehr weiter
alarm 0;
};
alarm 0;
if ($@ && $@ =~ /TIMEOUT/) {
warn('Pipe Print timeout');
}
Wenn ich anstelle von syswrite 'print $oPipe $sMessage' und anschließend
'$oPipe->flush()' benutze blockiert der Ablauf beim flush (eh logisch).
Was kann man dagegen tun. Hab auch schon can_write aus IO::Select
benutzt um die Beschreibbarkeit des Pipes zu überprüfen; das bringt aber
auch nix.
Beste Grüße
Maro¨