コンピュータシステム:プログラマの観点からは、次のように言います。
8.5.1 信号用語
保留中の信号は最大1回受信されます。各プロセスに対して、カーネルは
pending
ビットベクトルに保留中の信号セットを保持し、ビットベクトルにブロック信号セットを保持しますblocked
。
8.5.3 信号受信
いつカーネルはプロセス p をカーネルモードからユーザモードに切り替えます。 (たとえば、システムコールから復帰したりコンテキスト切り替えを完了したりするなど)、pでブロックされていない保留信号のセット(保留および遮断)を確認します。セットが空の場合(通常の場合)、コアはpの論理制御フロー(次のI)の次の命令に制御を渡します。しかし、セットが空でない場合カーネルはセット内のいくつかの信号kを選択する。(通常最小 k) p が信号 k を受信するように強制します。信号を受信すると、プロセスは特定のアクションをトリガします。プロセスが完了したらその後、制御はpの論理制御フローから次の命令(I next)に戻されます。
プロセスがカーネルモードにあるとき、カーネルブロックはデフォルトで信号を一時停止しますか?
blocked
プロセスがカーネルモードにあるとき、カーネルは保留中の信号に対してビットベクトルのビットを設定しますか?この場合、カーネルはデフォルトで信号をブロックしますか?以下の引用の「暗黙のブロックメカニズム」と同じ意味ですか?
8.5.4 信号の遮断と遮断解除
Linux は、暗黙的および明示的なブロッキング信号メカニズムを提供します。
暗黙のブロックメカニズムデフォルトでは、カーネルはハンドラが現在処理している保留中のシグナルの種類をブロックします。
選択した停止信号kが処理を完了した後、プロセスがカーネルモードにある間に停止した残りの停止信号は処理されますか? (引用は、「プロセスが操作を完了すると、制御はpの論理制御フロー(Iの後)の次のコマンドに戻されます」と示しています。
ありがとうございます。
答え1
いいえ、カーネルはブロックベクトルを変更しません。
コンテキストがカーネルモードからプロセスに切り替わる場合にのみ、信号はプロセスに渡されます。シグナルハンドラが完了すると、プロセスコールはsigreturn(2)
カーネルにコントロールを返します。
2番についてははい、いいえがあります。はい、カーネルは次にプロセスが実行されるようにスケジュールされたときに保留中の他のシグナルを渡します。ただし、ほとんどの信号では、同じタイプの複数の保留信号(たとえばSIGCHLD
)は一度だけ送信されます。これが上記の暗黙のブロックです。
SIGSEGV
一部の信号は、使用中に実行中の信号ハンドラを中断する可能性がありますSA_NODEFER
(参考資料を参照sigaction(2)
)。