Understanding Linux Kernel 輪読会 第9回 シグナル
- 3. 歴史的経緯
• Unix v2で追加されたシステムコール
• quit (= SIGQUIT)
• intr (= SIGINT)
• emit (= SGEMT)
• ilgins (= SIGFPE)
• ここらへんを整理するためにv4でsignalやらkillが導入
• もともとは異常が起きた時に通知するための仕組みだった
• POSIXで汎用に拡張される
- 6. リアルタイムシグナル
• → 新たにリアルタイムシグナルを導入
• 生成されたシグナルが配送されることを保証
• 小さいシグナル番号ほど優先度が高い
• シグナル番号だけでなくより詳細なsiginfo_t構造体も渡される
• シグナル番号はSIGRTMIN...SIGRTMAXの範囲
• どういう意味かはアプリケーション依存
• 従来のシグナルは1...SIGRTMIN-1に割り当て
- 7. その他
• 同期/非同期
• 同期:対象はスレッド (SIGSEGV, SIGILL)
• 非同期:対象はスレッドグループ (SIGINT, killによる配送)
• どれかが対処する
• シグナルハンドラ
• シグナルに対処するための関数
• スレッドグループ間で共有
• 特定のシグナル(SIGKILL, SIGSTOP)はデフォルトから変更できない
• シグナルマスク
• 配送されたらまずいシグナルを保留させる
• スレッドが個別に持つ
- 10. シグナルの生成
• send_signal: /kernel/signal.c:1127
• リアルタイムでなく既に生成済みなら終了(1045)
• SIGSTOP, SIGKILLならビットだけ立てて終了(1053)
• キューに追加するための領域を確保(1070)
• 成功したらキューに繋いで初期化
• 失敗したら
• リアルタイムシグナルは生成の失敗を通知
• 従来のシグナルは「キュー繋げなかったよ」と通知(生成自体は成功扱い)
• 最後にビットを立てて終了
- 14. 余談 PLAN9のはなし
• Plan9にはシグナルはない(代わりにnote)
• kill関数(not systemcall)
• https://goo.gl/ib9jVN
• 実際には /proc/[pid]/note に文字列を書き込んでいる
• cf: http://goo.gl/IrftTG Plan9 - /sys/man/2/notify
• なんかPlan9は色んなものをファイルに抽象化してるんだって