SIGUSR1がプロセスを終了させるのはなぜですか?


20

私は他の質問でこのコメントに驚いた:

USR1シグナルを開始後すぐにddに送信すると(つまり、bashスクリプトでは、開始した後の行)、実際には終了します。

誰でもその理由を説明できます


あなたの質問に対する答えではありませんが、このワンライナーを試してください:{ dd if=/dev/zero of=/dev/null & }; kill -USR1 $!; jobs; sleep 1; jobsあなたが説明している効果を再現するために。
ジッピー

回答:


38

各シグナルには「デフォルトの性質」があります-プロセスがそのシグナルを受信したときにデフォルトで行うこと。内のテーブルがありますsignal(7)それらを一覧表示するmanページは:

Signal     Value     Action   Comment
──────────────────────────────────────────────────────────────────────
...
SIGUSR1   30,10,16    Term    User-defined signal 1
SIGUSR2   31,12,17    Term    User-defined signal 2

SIGUSR1そして、SIGUSR2の両方がデフォルトのアクションを持っているTerm-プロセスが終了されます。ddハンドラーを登録してシグナルをインターセプトし、それを使って何か便利なことをしますが、あまりにも早くシグナルを送信した場合、そのハンドラーをまだ登録する時間がないため、代わりにデフォルトのアクションが発生します


1
このあいまいさを認識して、2回賛成できればと思います。明示的なシグナルハンドラーを削除した後、プロセスがランダムに停止するのを見ると混乱していました。
DeaconDesperado

1
合理的な時間(約0.5〜1秒)だけスリープするのではなく、この競合状態を制御する実用的な方法はありますか?(つまりstrace、シェルスクリプトで出力をキャプチャして解析するような滑luな何かの横に…)
エイドリアンギュンター

シェルスクリプトが正常に機能していました。しかし、可能性が高いために突然作業を停止します!kill -s SIGUSR1 $ PARENT_PIDを送信するサブプロセスの速度が速すぎますか?祖父母は、親が正常に終了したと考えますが、親はまだループを実行しています。これは良い投稿です。私はこれを理解しようとして一日の大半を費やしてきました。
ケミン周
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.