Übertragung des Signals an das übergeordnete Element bei Verwendung von System

Ich habe ein Wrapper-Skript geschrieben, das mit @ ein anderes Skript startesystem(). Das untergeordnete Skript fängtSIGINT und verarbeitet die Ausnahme intern. Daher sollte es das @ nicht verbreitSIGINT an das übergeordnete Element, wenn es beendet wird. In einigen Fällen erhält das übergeordnete Element jedoch weiterhin das SIGINT. Zum Beispiel parent.pl):

use feature qw(say);
use strict;
use warnings;
use POSIX ();

my @data = (q(child.pl 'dummy'), q(child.pl), q(bash -c child.pl), q(sh -c child.pl));

for ( @data ) {
    say "Running command '$_'..";
    my $res = system $_;
    my $signal = $res & 127;
    my $rval = $res >> 8;
    say "Parent received return value: $rval";
    if ( $signal == POSIX::SIGINT ) {
        say "Parent received SIGINT";
    }
}

undchild.pl:

use feature qw(say);
use strict;
use warnings;

eval {
    local $SIG{INT} = sub { die "Aborted by user.\n" };
    sleep 10;
};
if ( $@ ) {
    print "\n" . $@;
    exit 0;
}
say "Timed out..";
exit 1;

Wenn ich drücke STRG-C vor dem Timeout sieht die Ausgabe so aus:

Running command 'child.pl 'dummy''..
^C
Aborted by user.
Parent received return value: 0
Parent received SIGINT
Running command 'child.pl'..
^C
Aborted by user.
Parent received return value: 0
Running command 'bash -c child.pl'..
^C
Aborted by user.
Parent received return value: 0
Running command 'sh -c child.pl'..
^C
Aborted by user.
Parent received return value: 0
Parent received SIGINT

So im ersten und letzten Fall erhält der Elternteil dasSIGINT, während dies für den zweiten und dritten Fall nicht der Fall ist.

Was ist der Grund dafür? Und wie kann es behoben werden, dass der SIGINT nicht für den ersten und den letzten Fall weitergegeben wird?

(Ich vermute, es hängt mit der Art der Shell zusammen, d. H.sh vsbash )

Antworten auf die Frage(2)

Ihre Antwort auf die Frage