![Linuxカーネルが信号を処理する方法[閉じる]](https://linux33.com/image/147984/Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%8C%E4%BF%A1%E5%8F%B7%E3%82%92%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
私の質問は、シグナルとオペレーティングシステムのカーネル内の処理に関するものです。
各プロセスには独自のsignal_handler()
テーブルがあることがわかります。 31ビット信号配列(pending_signals
)、信号が到着するとdo_signal()が呼び出され、signal_handler()
カーネルモードではなくユーザーモードで実行される関連ルーチンを呼び出します。ところで何が起こっていますか?)。
プロセスがいくつかの信号を受信すると仮定する。つまり、信号配列のビットがオンになっていて、誰がその配列に書き込んでいるかを想定します(これが信号を呼び出したプロセスのようです。現在私たちが経験しているプロセスです)。プロセスは次のとおりです。
A
シグナルを呼び出し、それをシグナル配列にB
書き込み(ユーザーモードに戻る前に)、同じコンテキストで(Bに切り替えずに)そのシグナルの特定のシグナルハンドラーを呼び出しますB
(いつユーザーモードに切り替えますか?)。戻ってA
スケジュールを変更し、続行する必要があることを確認します。
2つ目は、信号が次のようなときに発生することです。私の考えでは、これがサブプロセス呼び出しのどこかでSIG_CHILD
起こるべきだと思います。do_exit()
最後のものはどのようにwaitpid(pid_t num)
機能しますか?
父はどのようにSIG_CHILD
他の息子のシグナルをすべて無視し、特定の息子にのみ関心を持つことができますか?
次の内容を読むことができる良い情報源があれば良いです(該当する情報源は見つかりませんでした)。
答え1
あなたの質問を読んでいる間。信号B
ハンドラがA
。これは正しくないようです。これによりセキュリティの脆弱性が発生する可能性があります。シグナルハンドラは常に所有プロセスのコンテキストで呼び出されます。
これはあなたの質問の2番目の部分への答えになりますSIG_CHILD
。
また、シグナルハンドラがユーザー空間で実行される理由も尋ねられます。これは、プロセスがカーネルにコードを注入したくないためです。そうすれば、彼らはシステムの神になります。
シグナルハンドラはどのプロセスで実行されますか?
プロセスがexecを呼び出し、ロードされたコードにsignal_handlerが含まれていて、このシグナルハンドラが実行されると(ロードされた他のすべてのコードと同様に)、このプロセスで実行されます。あるプロセスのコードが誤って別のプロセスで実行されることはありません。