カーネルやユーザからプロセスになにかを通知するために送られる。
何種類かあって、それぞれにデフォルトの動作が決まっているが、
デフォルトで無視されるものもある。
システムコールを捕捉(キャッチ、トラップ)して、プロセスが受け取った
ときに動作(シグナルハンドラ)を変更できる。
キャッチできないシグナルもある。例えばSIGKILLは、確実にプロセスを終了させる
ために、変更したりできなくなっている。
int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact)
対象シグナルを指定して、プロセスが受け取った際の動作を変更する。
signum
対象となるシグナルを指定する。
SIGKILLとSIGSTOPは、指定できない。
const struct sigaction *act
シグナルを受け取った時の動作などを指定する。
struct sigaction{
void (*sa_handler) (int);
void (*sa_sigaction) (int,siginfo_t *,void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer) (void);
}
sa_handlerとsa_sigactionは、どちらかのみを利用して、シグナルハンドラを指定する。
sa_maskは、ブロックするシグナルを指定するのに使う。
シグナルは、プロセスが実行されている時のいつ送られてくるか分からない。そうすると、シグナルハンドラ実行中に、同じシグナルが送られてきて、シグナルハンドラが二重にじっこうされるかもしれない。それを止めるために、シグナルハンドラ実行中にシグナルが送られてきたとき、そのシグナルを保留(ブロック)しておく。
このブロックしておくシグナルを指定するのにsa_maskを使う。
sigaction()で、シグナルハンドラ実行中は、基本的にsigaction()で指定されているシグナルはブロックされる。
マスクをつくる関数
int sigemptyset(sigset_t *set);マスクsetを空にする。
int sigfillset(sigset_t *set); マスクsetに全てのシグナルを指定する。
struct sigaction *oldact
sigaction()が実行されたときのシグナルハンドラが入る。
必要ないときはNULLを指定。
理解できてるような、できてないような中途半端な感じ。。。。
0 件のコメント:
コメントを投稿