分类:
2008-12-08 11:42:05
10.4 unreliable signals
指的是一些老的实现中的signal机制,它们经常会导致signal被lost,它们具有如下特点:
1.Signal handler是一次性的,需要re-install。
即触发一次后就无效了,该signal的处理就自动成为以前的默认的了。所以导致如果我们想一直使用该handler,就不得不在handler函数里面再次调用signal()来安装该handler,这样就造成问题:如果在handler函数内部,即发生了signal之后,在你重新安装signal handler之前,又发生了signal呢? 这个signal的处理就会按照默认的处理了,有可能将process结束掉了。
2.我们无法禁止某个signal的发生,更无法暂时将发生的信号暂存起来,以后处理
我们有时候,想禁止signal发生,做一些活之后,在允许他发生。比如下面代码:
int sig_int_flag; /* set nonzero when signal occurs */
main()
{
int sig_int(); /* my signal handling function */
...
signal(SIGINT, sig_int); /* establish handler */
...
while (sig_int_flag == 0)
pause(); /* go to sleep, waiting for signal*/
...
}
sig_int()
{
signal(SIGINT, sig_int); /* reestablish handler for next time */
sig_int_flag = 1; /* set flag for main loop to examine */
}
如果在while()检查完毕,sig_int_flag = 0的情况下,在调用pause()之前,发生了SIGINT,那么sig_int()会被调用,sig_int_flat会被置位1,然后程序依然会执行pause(),如果该信号只发生一次,那么就再也等不到该信号了。
这个函数,在调用while之前,应该像禁止SIGINT的发生,这样在作完检查,进入pause之后才能允许SIGINT的发生。或者说系统向具有一种不让某种信号发生,或者就算你发生了,暂时将你记录下来不做通知,等到了合适的时候再允许你发生,或者还能够找到以前发生过的信号的机制。
3.使用reliable signal机制
好处是:reliable signal机制可以使被interrupted的system call能够自动restart。方法是给signal handler加一个相应的标记。
Reliable signal机制可以不用每次都re-install signal handler函数
还可以enable以及disable a collection of signals即可以使能/禁用 一些signal。