linux-0.11调试教程,信号处理方式

信号处理方式根据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

linux-0.11调试教程,信号处理方式_第1张图片

3.0版310页把SIGCHLD的值弄错了





你可能感兴趣的:(linux-0.11调试教程,信号处理方式)