Если у меня есть сценарий, который является оболочкой для другой программы (например, оболочка для демонизатора или оболочка для mathematica ), иногда полезно отлавливать сигналы в оболочке запрограммировать и передать их в подпрограмму.
Например, вот некоторый код Perl для обработки сигнала INT (прерывания), так что если вы выполняете 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 отрывается от себя ...