私はユーザー空間で独自の信号処理メカニズムを開発しています。カーネルコードをナビゲートし、いくつかのCコードを実行するとき。私は気づいた。
シナリオ1:私のコードが信号を受信した後に信号ハンドラを実行するときに別の種類の新しい信号が発生すると仮定すると(この新しい信号も処理されます)、新しい信号信号ハンドラSH2はすでに実行されている信号ハンドラを保存します呼び出されます。 (SH1). SH2が完了すると、SH1は中断された部分から実行を再開します。
シナリオ2:SIGINT、SIGUSR2、およびSIGHUP信号に4つのハンドラを登録しました。その後、これらの信号をすべてブロックし、端末の「kill」コマンドを使用して信号を生成しました。その後、信号を再びロック解除しました。私が観察したのは、これらの信号が順番に渡され、対応するハンドラが順番に実行されることです。
したがって、シグナルハンドラが順次実行されるときとカスケードで実行されるときです。
カーネルのソースコードを調べました。
- 信号が生成されると、保留リストに追加され、TIF_SIGPENDING フラグがセットされます。タイマー割り込みが予約されると、このフラグがチェックされ(不明)do_signal()が実行され、信号をキューから除外してTIF_SIGPENDINGフラグが再計算されます。保留リストにさらに信号がある場合、このフラグはリセットされます。
スケジューラタイマーが期限切れになると、新しいシグナルハンドラが呼び出され(シグナルハンドラがカスケード接続されている)、シグナルハンドラはどのように順次実行されるのですか?