如果我有一个脚本是另一个程序的包装器(例如,守护程序包装器或mathematica 的包装器),有时在包装器程序中捕获信号并将它们传递给子程序很有用。例如,这里有一些处理 INT(中断)信号的 Perl 代码,因此如果您在启动包装器后执行 ctrl-C,子程序也会被中断:
my $subprogram = "foo args";
my $pid = open(F, "$subprogram |") or die "Can't open pipe from $subprogram: $!";
$SIG{INT} = sub { kill('INT', $pid);
close(F);
die "Passed along INT signal and now aborting.\n"; };
print while(<F>);
close(F);
在程序可能处理的[所有可能的信号]( http://en.wikipedia.org/wiki/Signal_(computing)中,包装器脚本应该传递哪些信号?
还有什么好的包装器应该做的吗?
编辑:最初这个问题是询问如何传递所有可能的信号。感谢最初的答案,我了解到这不是正确的问题。
编辑:我想出了是什么让我在这里循环。Mathematica 显然脱离了它的父进程。所以我必须明确地传递各种终止信号:
$SIG{INT} = sub { kill('INT', $pid); }; # pass along SIGINT (eg, ctrl-C)
$SIG{TERM} = sub { kill('TERM', $pid); }; # pass along SIGTERM (kill's default)
$SIG{QUIT} = sub { kill('QUIT', $pid); }; # pass along SIGQUIT
$SIG{ABRT} = sub { kill('ABRT', $pid); }; # pass along SIGABRT
$SIG{HUP} = sub { kill('HUP', $pid); }; # pass along SIGHUP
通常这不是必需的,因为子进程会自动传递这些信号(感谢让我直截了当的答案!)。所以现在我想知道为什么(以及如何)mathematica 脱离自身......