2010-06-21 3 views
1

У меня есть скрипт Perl со следующим кодом.Почему я получаю неожиданный код возврата?

... 
$kill = 1; 
$exit = 0; 
`kill -9 $pid >& /dev/null`; 
... 
print "kill=$kill exit=$exit\n"; 
if ($kill) { 
    exit $exit; 
} else { 
... 

Таким образом, этот скрипт использует open3() для запуска команды. В какой-то момент он убивает задание, а затем намерение заключается в том, что скрипт завершит работу с кодом 0. Я вставил оператор печати, чтобы показать значения переменных $kill и $exit, что показано ниже.

kill=1 exit=0 

С $kill 1, я ожидал бы сценарий, чтобы выйти с кодом 0 выше, так как $exit 0. Однако, сценарий завершается с кодом 9, который является сигналом, посланным к ребенку. Почему сценарий Perl, выходящий с кодом выхода дочернего элемента, вместо того, который передается вызову exit()?

+4

Orthogonal, но не рекомендуется использовать -9 как аргумент 'kill', за исключением самых сложных аварийных ситуаций. Вы отказываете процессу в праве выполнять любые задачи очистки, которые могут потребоваться. – Ether

+1

Какова ценность $ pid? –

ответ

0

От here:

Функция выхода() не всегда выйти немедленно. Он сначала вызывает любые определенные END-процедуры, но эти END-процедуры не могут сами прервать выход. Аналогично, все объекты-деструкторы, которые должны быть вызваны, вызываются перед реальным выходом.

+0

Итак, как я могу заставить его выйти с нужным кодом, все еще убивая ребенка? – dromodel

+0

Неприменимо. Поскольку он отправляет 'SIGKILL' (' kill -9'), процесс Perl принудительно завершается ядром и не разрешается запускать ** любой ** выключение или код очистки. 'exit' даже не вызван - как только этот' SIGKILL' попадает, все кончено, прежде чем код Perl знает, что его поразило. –

Смежные вопросы