シグナルはプロセスまたは特定のスレッドへ配送される非同期通知です。イベントを報告し操作を要求しますが、データ指向のプロセス間通信より運べる情報は限られます。
プロセス · レッスン 6
シグナル
Linux がプロセス制御とイベント通知のため、シグナルを生成、遮断、配送、処理する仕組みを学びます。
シグナルの発生元
- 端末が
Ctrl-CでSIGINT、Ctrl-ZでSIGTSTPを生成し、フォアグラウンドプロセスグループへ送る。 - スレッドが不正なメモリ参照をしたとき、カーネルが
SIGSEGVなどの同期シグナルを生成する。 - プロセスが、許可された別プロセスやプロセスグループへシグナルを送る。
- タイマー、子の状態変化、端末のハングアップがほかのシグナルを生成する。
送信側には通常、認証情報や capability に基づく適切な権限が必要です。シグナルはカーネルを介する制御インターフェースで、任意のユーザー間の無制限なメッセージではありません。
端末が Ctrl-C で通常生成するシグナルはどれですか?
処理方法と既定動作
多くのシグナルにはプロセス全体の処理方法があり、次の3つから応答を選びます。
- 定義済みの既定動作を行う
- シグナルを無視する
- ユーザーが設定したハンドラーを呼ぶ
既定動作は終了、コアダンプを伴う終了、停止、続行、無視などです。SIGTERM を捕捉すれば秩序立った終了を始められますが、ハンドラーは厳しい async-signal-safety 規則に従う必要があり、プログラムが終了を遅らせたり拒んだりもできます。
名前は番号より移植性と可読性に優れます。一般的な Linux では SIGTERM が15でも、関連規格が保証しない番号が全環境で同じとは限りません。ローカルの対応は kill -l で調べます。
プロセスが SIGTERM へ穏やかに応答できるのはなぜですか?
遮断と保留中シグナル
スレッドはシグナルマスクで、選択したシグナルの配送を一時的に遮断できます。遮断中に生成されたシグナルは、標準シグナルとリアルタイムシグナルの規則に従い、配送可能になるまで保留されます。同種の標準シグナルは発生回数ごとにキューへ入らず、まとめられる場合があります。
マルチスレッドプロセスでは、プロセス宛てシグナルは遮断していない適格なスレッドへ配送され、スレッド宛てシグナルは指定スレッドを対象にします。そのため「プロセスが遮断したか」だけでは不十分です。
遮断可能なシグナルが対象による遮断中に生成されると、通常どうなりますか?
処理できないシグナル
SIGKILL はプロセスを終了し、SIGSTOP は停止します。どちらも捕捉、無視、遮断できません。カーネルが最終的な制御を保てますが、SIGKILL ではアプリケーションが後始末する機会がありません。
それでも観測上、タスクが即座に消えない場合があります。割り込み不可能なカーネル操作を待っていることがあり、終了後も親が状態を回収する必要があります。
捕捉、無視、遮断できない組み合わせはどれですか?
レッスン完了
シグナル を完了しました
Linux のシグナル処理における主な段階と制約を説明できるようになりました。
端末、カーネル、プロセスが生成するシグナルを特定する。
既定動作、無視、ハンドラーを区別する。
遮断を保留中の配送とスレッドマスクへ関連付ける。
SIGKILLとSIGSTOPは処理も遮断もできないと覚える。