fork()
とexecを使用して子プロセスを作成するサーバーコードに取り組んでいます。 fork()
が成功し、CHILD
シグナルが捕捉されたときにクリーンアップされると、子供のPIDが登録されます。KILL信号はすぐにプロセスを終了しますか?
サーバを停止する必要がある場合は、すべてのプログラムが強制終了され、最終的にはKILL信号が返されます。これは、登録されたすべてのPIDを反復処理し、CHILDシグナルハンドラがPIDを削除するのを待つことで機能します。子プログラムが正しく終了しなかった場合、これは失敗します。したがって、waitpid
と組み合わせてkill
を使用して、PIDリストがクリーンアップされ、ログが作成され、それ以外の場合は何か他の処理を実行するようにします。
は、次のサンプルコードを検討:waitpid(2)
から
kill(pid, SIGKILL);
waitpid(pid, NULL, WNOHANG);
の抜粋:
のwaitpid():成功すると、状態変化した子プロセスのプロセスIDを返します。 WNOHANGが指定されていて、pidで指定された1つまたは複数の子(ren) がまだ状態を変更していない場合は、0が戻されます。エラーの場合、-1が返されます。
pid
によって与えられるプロセスは、次の機能が起動する前にいつも消えていますか?上記の場合、waitpid
はいつも-1
を返しますか?
KILL信号はむしろ残念です。また、 'kill'システムコールのリターンコードは何ですか? – fge
"CHILDシグナルハンドラを待っています..." - SIGKILLのシグナルハンドラはありません。 SIGSTOPとSIGKILLを除くすべてのシグナルは 'sigaction'(ハンドラを呼び出すなど)によって設定されたもの、またはデフォルトを行います。 SIGSTOPはただ停止し、SIGKILLはプロセスを強制終了します。常に。処理や条件付きはありません。 (あなたが十分な権利を持っていないため、 'kill'システムコールが失敗することを除いて) – Damon
@Damon: 'SIGKILL'は宛先プロセスで無視できません。しかし、それは質問/問題ではありません。ソースプロセス上の 'kill(2)'システムコールは、シグナルが(カーネルによって)デスティネーションプロセスのコンテキストで評価される前に戻ることができます。 'kill(2)'は基本的には非常にシンプルな非同期通信であり、すべての意味を持つように扱われなければなりません。 –