2011-09-14 4 views
0

Я запускаю программу Perl, в программе есть модуль, который запускается внешним процессом, чтобы убить все дочерние процессы и прекратить его выполнение. Это прекрасно работает.

Но, когда определенная функция говорит, что xyz() выполняет sleep(60) заявление о состоянии.

В настоящее время функция выполняется несколько раз, так как она ждет некоторого значения.

Когда я запускаю процесс уничтожения, как указано выше, процесс не выполняется.

Кто-нибудь знает, почему это происходит?

+2

Вопрос немного запутанный. Вы пытаетесь убить родительский процесс или дочерний процесс? после разветвления два процесса имеют собственное адресное пространство и не зависят друг от друга, если вы не используете какой-либо IPC. Пожалуйста, ОБРАТИТЕ ВАШ ВОПРОС. – Arunmu

+1

Почему это помечено как «proc»? Это одно из значений, перечисленных в http://meta.stackexchange.com/questions/107791/how-should-the-proc-tag-be-split-up –

ответ

0

Я не понимаю, как вы пытаетесь убить процесс изнутри себя (ваш вопрос $$), когда он спит.

Если вы убиваете из РАЗЛИЧНОГО процесса, тогда у него будет свой собственный $$. Вам нужно сначала узнать, что PID исходного процесса убивает первым (путем списка процессов троллинга или каким-то образом передавая его из исходного процесса).

убийство спящего процесс работает очень хорошо

$ (date ; perl5.8 -e 'sleep(100);' ; date) & 

    Wed Sep 14 09:48:29 EDT 2011 

$ kill -KILL 8897 

    Wed Sep 14 09:48:54 EDT 2011 

Это также работает с другими сигналами "killish" ('INT', 'ABRT', 'QUIT', 'TERM')


ОБНОВЛЕНИЕ: при повторном чтении может возникнуть проблема, которую вы имели в виду, так это то, что части, вызванной внешним процессом, не происходит. Если это так, то вам нужно:

  • Настройка CATCHABLE обработчик сигнала в вашем процессе перед сном ($SIG{'INT'}) - SIGKILL не может быть перехвачено обработчиком.

  • Отправить SIGINT из указанного «внешний процесс»

  • ли всю необходимую очистку один раз сон() прерывается SIGINT из обработчика SIGINT.

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