2007年10月1日月曜日

シグナル



カーネルやユーザからプロセスになにかを通知するために送られる。


何種類かあって、それぞれにデフォルトの動作が決まっているが、


デフォルトで無視されるものもある。


システムコールを捕捉(キャッチ、トラップ)して、プロセスが受け取った


ときに動作(シグナルハンドラ)を変更できる。





キャッチできないシグナルもある。例えば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 件のコメント:

コメントを投稿