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
)