Распространение сигнала к родителю при использовании системы
Я написал скрипт-обертку, который запускает другой скрипт, используя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
)