2011-09-14 3 views
0

私はPerlプログラムを実行しています。プログラムには、外部プロセスによって起動され、すべての子プロセスを強制終了し、その実行を終了するモジュールがあります。 これは正常に動作します。

しかし、特定の関数xyz()が実行されていると、条件にはsleep(60)というステートメントがあります。

今、関数は何らかの値を待っているときに繰り返し実行されます。

上記のようにキルプロセスをトリガすると、プロセスは実行されません。

これはなぜ起こっているのか誰かが手がかりを持っていますか?

+2

質問はちょっと混乱します。親プロセスまたは子プロセスを強制終了しようとしていますか? IPCを使用している場合を除いて、2つのプロセスはそれぞれ独自のアドレス空間を持ち、互いに依存しません。あなたの質問に答えてください。 – Arunmu

+1

なぜこのタグは "proc"ですか? http://meta.stackexchange.com/questions/107791/how-should-the-proc-tag-be-split-upに記載されている意味の1つですか? –

答えて

0

眠っているときに、自分自身の中からプロセスをどのように殺すか(問題のあなたの$$)はわかりません。

異なるプロセスから強制終了した場合は、独自の$$を持つことになります。最初にkillする元のプロセスの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')


更新:再読みの際に、「外部プロセスによってトリガされた」という部分は起こらないということを意味する問題かもしれません。その場合は、以下を行う必要があります。

  • は($SIG{'INT'})を寝る前に、あなたのプロセスで捕捉可能なシグナルハンドラを設定する - SIGKILLは、ハンドラでキャッチすることができません。

  • 「外部プロセス」

  • は(スリープいったんすべての必要なクリーンアップを実行したからSIGINTを送る)がSIGINTハンドラからのSIGINTによって中断されています。

関連する問題