Perl: Schließen der Subprozess-Pipe im Signal-Handler hängt?

8

Ich muss bei einem Skript, das die Blockierung von io blockiert, Timeouts geben.
Überraschenderweise stellt sich heraus, dass exit hängt, wenn eine offene Pipe zu einem Subprozess existiert:

%Vor%

Ohne open call funktioniert es, das Entfernen ist leider keine Option, in diesem Fall benötigt das Skript es.

Sieht so aus, als ob exit versucht, das Dateihandle zu schließen, und das hängt davon ab:

%Vor%

Ich schätze, es ist nicht besonders glücklich, das Kind in einem Signalhandler zu ernten ...

Weiß jemand einen guten Weg dazu?

    
lemonsqueeze 25.01.2016, 05:27
quelle

2 Antworten

10

Der Signal-Handler ist ein Ablenkungsmanöver, schließen wird jedoch blockiert:

%Vor%

Eine Möglichkeit, dies zu beheben, besteht darin, die Subprozess-ID über offen und dann kill dieses Kind:

%Vor%     
Miller 25.01.2016, 06:11
quelle
1

Die Verwendung von POSIX::_exit() direkt, wie die Man-Seite vermuten lässt, scheint dieses spezielle Problem zu umgehen. Aber das riecht nach einem A-B-Problem. Sind Sie sicher, dass Ihr eigentliches Problem nicht besser gelöst werden kann, wenn Sie Subprozesse komplexer handhaben als einfache Pipes, wie zum Beispiel IPC::Run ?

    
Calle Dybedahl 25.01.2016 06:02
quelle

Tags und Links