Ich habe das folgende Problem, das ich in diesen beiden Mini-Perl-Skripten rekonstruiert habe. Dies ist das Hauptskript:Senden eines Signals an ein Perl-Skript, während es ein Dateihandle schließt
#!/usr/bin/perl
$SIG{INT} = \&signal_handler_one;
open(my $pipe, "|-", "/home/pa/Desktop/POC2");
close $pipe;
sub signal_handler_one{
print "This is expected to print\n";
}
In der dritten Zeile es ein Rohr zu diesem Skript öffnet:
#!/usr/bin/perl
$SIG{INT} = \&signal_handler_two;
sleep(10);
sub signal_handler_two{
print "This isn't expected to print\n";
}
Das Problem ist, dass, wenn ich das erste Skript zu starten und dann SIGINT an ihn schicken, während es schließt die Leitung auf Leitung 4, der signal_handler_two wird anstelle von signal_handler_one ausgelöst. Warum verhält es sich so? Gibt es einen Weg dazu (mein Ziel ist es, signal_handler_one zur Ausführung zu bringen).
Bearbeiten: Ich habe ursprünglich das Signal auf dem Terminal mit Strg + C gesendet, was bewirkt, dass "Dies wird nicht erwartet zu drucken" zu drucken. Aber wenn ich das Signal mit kill zum Elternprozess von einem anderen Terminal aus aussende, ignoriert es es einfach.
Edit 2: Ich löste es schließlich von nicht offen mit der Leitung, sondern durch manuelle Forking, execing und dann statt Aufruf von nur Nähe auf dem Kind warten, um zu bekommen . Jetzt scheint alles gut zu funktionieren. Es scheint, dass dieses Verhalten für meine Umgebung spezifisch war, aber wenn jemand diesen Fehler reproduzieren könnte, lass es mich wissen.
Also ist das zweite Skript 'POC2'? Wie schickst du das Signal genau? Woher weißt du, dass das erste Skript die Pipe schließt? – Borodin
Ich sende es mit Strg + C am Terminal. Der Close-Call blockiert, bis der zweite Prozess beendet wird. Es gibt ein 10 Sekunden langes Fenster, in dem ich Strg + C zur richtigen Zeit senden kann. Ja, POC2 ist das zweite Skript. – Void
Ich denke, Sie werden feststellen, dass Ctrl-C das Signal an den zuletzt aktiven Prozess sendet. Sie können selektiver sein, indem Sie den ersten Prozess veranlassen, seine PID mit 'print '$$ \ n" 'zu melden und dann' kill -s INT 1234' in der Befehlszeile, wobei' 1234' durch die tatsächliche PID ersetzt wird. – Borodin