Was geht hier vor? Ich dachte, SIGINT würde an die Vordergrundprozessgruppe gesendet werden.Warum wird SIGINT hier nicht erwischt?
(ich glaube, vielleicht, dass das System() ist eine Shell ausgeführt wird, die eine neue Prozessgruppe für das Kind Prozess schafft? Kann das jemand bestätigen?)
% perl
local $SIG{INT} = sub { print "caught signal\n"; };
system('sleep', '10');
schlug dann ctrl + d dann ctrl + c sofort und beachten Sie, dass "Signal abgefangen" nie gedruckt wird.
Ich fühle mich wie das ist eine einfache Sache ... wie auch immer, um dies zu umgehen? Das Problem ist, dass beim Ausführen einer Reihe von Befehlen über das System hält Strg + C bis alle Iterationen abgeschlossen sind (weil Perl nie das SIGINT erhält) und ist eher ärgerlich ...
Wie kann dies umgangen werden? (Getestet habe ich bereits Gabel() direkt und verstehen, dass dies funktioniert ... das ist keine akzeptable Lösung zu diesem Zeitpunkt)
UPDATE: Bitte beachten Sie, das hat nichts mit „schlafen“ zu tun, nur die Tatsache, dass der Befehl eine willkürlich lange Zeit benötigt, um zu laufen, was erheblich mehr ist als die der umgebenden Perle. So sehr, dass das Drücken von Strg + C an den Befehl gesendet wird (wie in der Vordergrundprozessgruppe?) Und es irgendwie schafft, niemals an Perl gesendet zu werden.
ich denke, ich muss die Dokumentation noch einmal lesen: -/Danke. – dlamotte
Ich würde hinzufügen, dass der Grund, warum Sie den Rückgabewert des Kindes untersuchen müssen, ist, dass Ihre Shell die^c/INT an die gesamte Prozessgruppe, Perl und Kinder liefert, in diesem Fall beendet Ihr Kind "Schlaf 10". Wenn Sie einfach "-INT $ perl_pid" von einer anderen Shell entfernen, wird Perl Ihnen gerne SIG_IGN geben. – pilcrow