APUE memo
Chapter. 10 シグナル
- プロセスは「シグナルがおこったら、何かを実行してくれ」とカーネルに伝えておく
- 3つの処理 disposition が選択できる
- シグナルの無視 SIGKILL と SIGSTOP は無視できない
- シグナルの捕捉 SIGKILL と SIGSTOP は捕捉できない
- デフォルト動作
シグナルの歴史
- 信頼できないシグナル UNIXv7 のころ. 紛失してしまう
- シグナルがおこったら、デフォルトの動作にリセットされる
- プロセスでシグナルをうけとりたくないときに、OFFにできないこと
- IO処理中(遅いシステムコール)でシグナルによる割り込み
- 4.2 BSD でシステムコールの自動再起動ができるようになった
- ただ、4.3 BSDでシグナルごとに無効にできるようになった
- 再入可能関数
- シグナルハンドラで呼んでよい関数
- 以下の関数は含まれない
- 静的なデータ構造をもつ
- malloc/free をよぶ
- 標準入出力ライブラリの一部
- SIGCHLD と SIGCLD
信頼できるシグナル
- シグナルが生起する (カーネルはプロセステーブル内のフラグを立てる)
- プロセスにシグナルが配送される
- 「生起」と「配送」の間はシグナルはブロックされ、 プロセスが当該シグナルについてアンブロックするか無視するかまで「保留」されている
- Q. シグナルが複数生起して、すべてが保留となったら
- シグナルキューもある
- 1回だけ配送する
- Q. プロセスに複数の配送可能なシグナルがあるときは?
- プロセスにシグナルを配送する順番は決められていない
- 各プロセスにはブロックしているシグナルを表すビットマスクーーシグナルマスクが存在する
sleep を alarm/pause で実装する
ただしいシグナルのあつかいかたについて。
- 呼び出し側でアラームが設定されていると、上書きされてしまう
- SIGALARM のシグナルハンドラを書き換えしている
- alarm/pause のあいだでのレースコンディション
うえから3つめ: setjmp/longjmp による解決