プロセスが停止した後に信号を受信するとどうなりますかSIGSTOP
?
私はこれがどのように処理されるかを理解し、明確に理解しようとしています。残念ながら、私が見つけることができるのはシグナルの簡単な説明であり、特定のユースケースに関する詳細はありません。
今まで私が理解したことは、動作しているSIGSTOP
間は次のとおりです。
SIGKILL
プロセスはすぐに終了します。- 他の信号は収集され、
SIGCONT
保留中の信号はその瞬間にすべての信号が送信されたかのようにプロセスから解放されます。 - 一般に、、
SIGCONT
ssa_mask
などを適用したsa_flags
後に集計された信号を処理するときSA_RESTART
たとえば、SIGSTOP
-> SIGHUP
->SIGCONT
シーケンスが存在する場合、afterが受信されるSIGHUP
まで処理は保留されますSIGCONT
。
これが正しいかどうかはわかりません。
私はまだこれらの出来事について知っていません:
信号が収集される順序はまだ混乱しています。
例:
SIGSTOP
->SIGHUP
->SIGTERM
->SIGCONT
: 合計は受信した順序で処理されますかSIGHUP
、それともランダムな順序で処理されますか?SIGTERM
SIGSTOP
有効期間中に同じ信号が複数回受信されるとどうなりますか?SIGSTOP
->SIGHUP
->SIGHUP
->SIGCONT
SIGSTOP
実行中のシグナルハンドラを停止しますか?信号が処理を待っている場合は、後で続くのですかSIGCONT
?
これらの同様の質問に対する答えからいくつかの答えを見つけましたが、上記のことについてはまだ明確ではありません。
答え1
SIGSTOP
「動作」するものではありません。信号が転送された後、プロセスは停止します。この状態が有効な状態です。この状態のプロセスに対していくつかの信号が生成されると中断される。停止したプロセスに信号を渡すことはできません。処理が再度実行されると、信号処理マスクに従って処理され処理される。信号を無視します。
指定された順序がわからない。リアルタイム信号だけが安定したキュー属性を持ちます。たとえば、POSIXには、「呼び出し後に保留中のブロック解除シグナルがある場合は、sigprocmask()
sigprocmask()呼び出しが返される前にこれらのシグナルの少なくとも1つを渡す必要があります」というフレーズが含まれています。どちらが最初に送信されるかは指定しません。
もちろん、いくつかの特別な動作があります。 SIGSTOPによって停止されるとしてもSIGKILLによって終了することを防ぐことはできません。