- 论坛徽章:
- 0
|
原帖由 eclipse_2 于 2008-11-14 09:49 发表
2.4.0版本的
细节确实是不一样的
不过我觉得流程还是差不多的吧
嗯,处理流程大部分都是一样的。看看你贴的代码:
do_signal()
{
for (; {
.......
ka = ¤t->sig->action[signr-1];
if (ka->sa.sa_handler == SIG_IGN) {
if (signr != SIGCHLD)
continue;
/* Check for SIGCHLD: it's special. */
while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
/* nothing */;
continue;
}
if (ka->sa.sa_handler == SIG_DFL) {
.......
/* Whee! Actually deliver the signal. */
handle_signal(signr, ka, &info, oldset, regs);
return 1;
}
}
上面3个红色部分,前两部分就是对SIG_IGN和SIG_DFL的处理,对于这两种类型很多时候都continue了,就是继续执行下一个信号处理。而剩下的那些(包括用户自己定义的)就执行handle_signal函数,然后函数就返回了(最终执行用户定于的信号处理函数了)
从这里看出,实际上就执行了一个用户自定义的信号的处理函数。其他自定义信号的处理函数要等到下一次再调用do_signal的时候了。:)
[ 本帖最后由 greek_zjb 于 2008-11-14 10:16 编辑 ] |
|