Unixカーネルの信号処理

Unixカーネルの信号処理

The Design Of UNIX OSを読んでいますが、質問があります。

信号処理関数は signal() 呼び出しで指定できます。ハンドラは、プロセスが特定の信号を受信したときに実行する必要があります。プロセスがシグナルを受信すると、psig というアルゴリズムが実行され、シグナルを処理します。

カスタムハンドラが指定されている場合、psigアルゴリズムはユーザーレベルのコンテキストを変更します(つまり、スタックポインタがスタックの上部を指している間にフレームをスタックの上部にプッシュします)。このフレームはハンドラ機能の実行を示します。

上記がtrueの場合、信号処理関数は常にsignal()呼び出しが返された後に実行する必要があります(カーネルは最初にスタックの上のスタックフレームをチェックするためです)。ただし、これはコードの最初に(たとえばmain()で)特定の信号の信号ハンドラを指定し、コードの後半に信号を送信できるためです。シグナル処理関数は、signal()呼び出しの直後ではなく、シグナルが送信されたときにのみ実行されます(例:kill()呼び出しを介して)。

誰かがこれを明確にすることができますか?

ベストアンサー1

私は、「Unixオペレーティングシステムの設計」は、実際にはモーリスJ.バッハの「Unixオペレーティングシステムの設計」を意味すると思います。

あなたが直面する内容についての最善の推測は、203〜204ページにわたるセクション7.2.1です。彼は、シグナルハンドラの設定方法を説明する2つの段落で始まり、次にプログラムがキャプチャするように要求する信号を受信したときにカーネルが何をするかを説明する3番目の段落で始まります。

ある段落が別の段落の後に続くという事実は、そこに説明されていることが時間の直後に起こったことを教えてくれません。散文店はコンピュータアルゴリズムではありません。バッハはその間に何が起こったのかを明示的に話すことなく、2つの個別の出来事だけを説明します。

したがって、答えは「いいえ」です。呼び出しが完了したpsig()直後には実行されませんsignal(2)。バッハはそうは言わなかった。あなたはちょうど仮定した。

おすすめ記事