Ich muss Timeout für ein Skript, das blockiert io.
Überraschenderweise stellt sich exit
hängt heraus, ob es ein offenes Rohr zu einem Teilprozess ist:Perl: Schließen der Subprozess-Pipe im Signal-Handler hängt?
#!/usr/bin/perl
(-f "foo") || die "file foo doesn't exist";
open(IN, "tail -f foo |");
$SIG{ALRM} = sub
{
print "trying to exit...\n";
exit 0; # Hangs with above open() call
};
alarm 1;
while (1)
{
sleep 5; # Do stuff ...
}
Ohne open
Anruf funktioniert es leider zu entfernen es keine Option in diesem Fall ist das Skript, die es braucht.
Sieht aus wie exit
versucht, die Dateikennung und das ist zu schließen, was hängt:
$SIG{ALRM} = sub
{
print "trying to close...\n";
close(IN); # Hangs ...
print "ok\n";
exit 0;
};
Ich denke, es ist nicht allzu glücklich über das Kind aus dem Inneren eines Signal-Handler erntet ...
Does Wer kennt das schon?
Natürlich hast du recht, alberne mich! Der verwirrende Teil war, dass ein früher 'Exit' tatsächlich funktioniert, aber nur weil es eine Race Condition erzeugt (das Kind ist noch nicht fertig). Vielen Dank ! – lemonsqueeze