系统采用如下结构体存储信号以及其对应的名字和处理函数
typedef struct _sig_element
{
int signal; char *signame;
__p_sig_fn_t handler;
}sig_element;
static sig_element | []; |
signal函数的实现:
for(i=0; i < sizeof(signal_list)/sizeof(signal_list[0]); i++) { if ( signal_list[i].signal == sig ) { temp = signal_list[i].handler; signal_list[i].handler = func; return temp; }}本质就是保存信号对应的处理函数,由代码可见,一个信号是只能对应一个处理函数的,先前的函数会被覆盖。raise函数的实现for(i=0;i<sizeof(signal_list)/sizeof(signal_list[0]);i++) { if ( signal_list[i].signal == sig ) { temp = signal_list[i].handler; break; } }if(temp == SIG_IGN)// || (sig == SIGQUIT && temp == (_p_sig_fn_t)SIG_DFL)) return 0; /* Ignore it */if(temp == SIG_DFL) _default_handler(sig); /* this does not return */ else temp(sig);本质就是根据信号取得其对应的处理函数然后调用