2016-01-25 12 views
8

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?

Antwort

10

Der Signal-Handler ist ein roter Hering, wird close unabhängig blockieren:

open my $foo, "tail -f foo |" or die "Can't open process: $!"; 

close $foo;  # <--- will block 

Eine Möglichkeit, dies zu beheben, ist die Teilprozess-ID über open zu erfassen und dann kill dieses Kind:

my $subprocess = open my $foo, "tail -f foo |" or die "Can't open process: $!"; 

say "subprocess=$subprocess"; 

kill 'KILL', $subprocess; 

close $foo;  # <--- happy now 
+1

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

1

Mit POSIX::_exit() direkt wie die Man-Seite schlägt scheint um dieses spezielle Problem zu arbeiten. Aber das riecht nach einem A-B-Problem. Sind Sie sicher, dass Ihr tatsächliches Problem nicht besser gelöst werden kann, wenn Sie Subprozesse differenzierter handhaben als einfache Pipes, wie zum Beispiel IPC::Run?

+0

Das funktioniert auch, aber der "Schwanz" -Prozess läuft weiter und wird verwaist ... – lemonsqueeze

Verwandte Themen