シグナルをキャッチしてみる
まずは基本.BASHでいうとtrapになるだろうか.
シグナルと言って思い出すのはkillとか端末からのC-cだろうか.killはプロセスにシグナルを送るコマンドで(関数もある),C-cはシェルがシグナルを生成してプロセスに送る.とにかく我々は普段シグナルを送信しまくっている.で,シグナルというのは結局なんなのかというと,(割り込み)イベントである(と思う).GUIではイベント駆動とか言って,ボタンがクリックされたらこれを実行するなどと指定するが,シグナルも同様で,このシグナルをキャッチしたらあれを実行するという風に指定しておく.そして実際にプロセスがシグナルをキャッチしたらあれを実行する.この「あれ」はシグナルハンドラと呼ばれるなんらかの関数である.
シグナルはイベントで,いろいろなイベントがあるハズだ.これは
man 7 signalで参照できる.これらの中にはキャッチできないものや無視できないものなどがある.
シグナルをキャッチするもっとも簡単なサンプルを以下に示す.
サンプルでやっているのは,シグナルハンドラをデフォルトとは違ったものに設定する,という処理である.で,そのシグナルハンドラの設定は関数signalで行なう.その関数ヘッダを以下に示す.
void (*signal(int sig,void (*func)(int)))(int);かなり変態的である.カーニハンとリッチーによるプログラミング言語C(ISBN 4-320-02692-6)を参考に翻訳すると
signal is a function(int, function(int) returning pointer to void) returning pointer to function(int) returning void.となるだろうか.これを読みやすくすると,man signalにあるように
typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t sighandler);となる.一つtypedefするだけでかなり読みやすくなった.で,シグナルハンドラに特別なものとして以下のものがある.
- SIG_IGN
- シグナルを無視する
- SIG_DFN
- デフォルトの動作

