Распространение сигнала к родителю при использовании системы

Я написал скрипт-обертку, который запускает другой скрипт, используяsystem(), Дочерний сценарий ловушекSIGINT и обрабатывает исключение внутри. Поэтому он не должен распространятьSIGINT к своему родителю при выходе. Однако в некоторых случаях родитель все еще получаетSIGINT, Например (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";
    }
}

а такжеchild.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;

Если я нажмуCTRL-C до истечения времени ожидания результат выглядит так:

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

Таким образом, в первом и последнем случае родитель получаетSIGINTтогда как для второго и третьего случаев это не так.

Что является причиной этого? И как это можно исправить так, чтобы SIGINT не распространялся для первого и последнего случая?

(Я подозреваю, что это связано с типом Shell, т.е.sh противbash )

Ответы на вопрос(1)

Ваш ответ на вопрос