2011-05-10 5 views
1

SIGINTシグナルを処理するために作成した関数が定数ループでスタックされています。この考え方は、CTRL-Cを親プロセスが無視し、子プロセスに送信することです(デフォルトではCTRL-Cを処理します)。何が起こるかは、CTRL-Cを押すとシグナルハンドラ関数が呼び出されますが、無限ループに陥ります。 killコールは、送信者プロセス以外のプロセスグループ内のすべてのプロセスにSIGTERMを送信することになっています。どんな助けもありがとう。シグナルハンドラ関数がループを維持する

機能コードは次のとおりです。

void intHandler(int signum) { 
kill(0, SIGTERM); 

}(メインで)

関数呼び出しのコードは次のとおりです。キルのmanページから

(void) sigset(SIGINT, intHandler); 
+0

"送信者プロセスを除いて" - 仕様にはそのような記述はありません。 SIGTERMをブロックするか、プロセスをプロセスグループから削除する必要があります。 –

+0

、グローバルで子プロセスを追跡し、すべてのプロセスではなく子プロセスを明示的に 'kill'します。 IIRCでは 'sigaction'を使用して、' SIGTERM'が親によって無視され、子機でブロック解除されるようにすることもできます。 –

+0

私はあなたが言ったことを正確にやり遂げました。それは私が必要とする通りに正確に動作します。ありがとうございます – zetatr

答えて

2

pidが0の場合、sigはプロセスグループIDが送信者のプロセスグループIDと等しいすべてのプロセス(指定されていないシステムプロセスを除く)に送信され、そのプロセスには信号を送る。

送信側に信号を送信しないことについて何も、あなたが最も可能性が高いような何かしたいので:

void intHandler(int signum) { 
    sigset(SIGINT, SIG_DFL); 
    kill(0, SIGTERM); 
} 

をこれは、すべてのメンバーにSIGTERMを送信する前にデフォルトに送信者にあなたのシグナルハンドラをリセットしますプロセスグループ

+0

ああ、私は参照してください。そのコードはまだ親プロセスを終了しないでしょうか?子プロセスを継続して終了するには、親プロセスが必要です。 – zetatr

+0

グローバル変数を使用して、子プロセスPIDを追跡することにしました。 – zetatr

+0

SIGINTシグナルハンドラをリセットしても、SIGTERMはプロセスを強制終了しません。 –