信号处理方式根据sa_handle可以分为3中。
第一种:默认,如果是SIGCHLD则返回。如果不是则调用do_exit()函数结束进程。蓝色代码。
第二种:忽略,直接返回。红色代码。update对信号值SIGINT和SIGTERM的处理句柄为SIG_IGN(忽略)。
第三种:用户自定义,收到对应的信号后,则会运行用户的自定义程序。
void do_signal(long signr,long eax, long ebx, long ecx, long edx,
long fs, long es, long ds,
long eip, long cs, long eflags,
unsigned long * esp, long ss)
{
unsigned long sa_handler;
long old_eip=eip;
struct sigaction * sa = current->sigaction + signr - 1;
int longs;
unsigned long * tmp_esp;
sa_handler = (unsigned long) sa->sa_handler;
if (sa_handler==1)
return;
if (!sa_handler) {
if (signr==SIGCHLD)
return;
else
do_exit(1<<(signr-1));
}
if (sa->sa_flags & SA_ONESHOT)
sa->sa_handler = NULL;
1.9.5版中147页把SIGCHLD的含义弄错了。
#define SIGCHLD 17
3.0版310页把SIGCHLD的值弄错了。