Propagación de la señal a los padres cuando se usa el sistema

He escrito un script de envoltura que inicia otro script usandosystem(). Las trampas de guiones secundariosSIGINT y procesa la excepción internamente. Por lo tanto, no debe propagar elSIGINT a su padre cuando sale. Sin embargo, en algunos casos el padre todavía recibe elSIGINT. Por ejemplo (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";
    }
}

ychild.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;

Si presionoCTRL-C antes del tiempo de espera, la salida se ve así:

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

Entonces, en el primer y último caso, el padre recibe elSIGINT, mientras que para el segundo y tercer casos no lo hace.

¿Cuál es la razón para esto? ¿Y cómo se puede solucionar de modo que SIGINT no se propague para el primer y el último caso?

(Sospecho que está relacionado con el tipo de Shell, es decirsh vsbash )

Respuestas a la pregunta(1)

Su respuesta a la pregunta