本文共 1584 字,大约阅读时间需要 5 分钟。
信号 异步通信机制 不可靠/可靠信号处理方式 忽略 // SIGILL 和 SIGSTOP 不可忽略 捕捉 // SIGILL 和 SIGSTOP 不可捕获 默认 // 信号处理对每一个信号有default(不是上面的默认)处理方式 // 而用户可以修改 // 也就是说如果一个信号如果默认为忽略,但是我可以将其改为 捕捉常见信号默认用途 ctrl-c SIGINT 终止 除0 SIGFPE 终止 无效内存引用 SIGSEGV 终止 网络带外数据到来 SIGURG 忽略 写一个读终止的管道 SIGPIPE 终止 进程定时器超时 SIGALAM 终止信号的发送 对一个进程发送一个信号的本质是 把信号挂载到目标进程的信号 pending 队列上去 信号的接收 (不管信号处理方式如何,信号肯定会被接收) 信号真正得到执行的时机是进程执行完异常,返回到用户态的时刻 内核进程是不响应信号的(因为它不会返回到用户态),除非它刻意的去查询
__send_signal() -> complete_signal() -> signal_wake_up() -> signal_wake_up_state()signal_wake_up_state if (!wake_up_state(t, state | TASK_INTERRUPTIBLE)) kick_process(t);
__irq_usr ret_to_user_from_irq slow_work_pending do_work_pending do_signal do_signal 如果是 system call 被信号中断,判断是否需要重启 system call get_signal() // (2) 从线程的信号 pending 队列中取出信号, // dequeue_signal 从信号pending队列中,取出优先级最好的信号 ka = &sighand->action[signr-1]; 从信号处理数组sighand中,取出信号对应的处理函数 ka->sa.sa_handler == SIG_IGN : continue // 忽略 ka->sa.sa_handler != SIG_DFL : break ; // break 返回之后 调用 handle_signal//捕获第一步 其他 // 默认 一部分 sig_kernel_ignore // SIGCONT SIGCHLD SIGWINCH SIGURG 一部分 sig_kernel_stop // SIGSTOP SIGTSTP SIGTTIN SIGTTOU 一部分 sig_kernel_coredump->do_coredump // SIGQUIT SIGILL SIGTRAP SIGABRT SIGFPE SIGSEGV SIGBUS SIGSYS SIGXCPU SIGXFSZ 一部分 do_group_exit handle_signal() // 有对应的用户自定义处理函数,则执行用户态处理函数 // 捕获第二步 compat_setup_frame // 构造返回堆栈,将返回地址替换为 用户注册的信号处理函数 user_fastforward_single_step // 切换到用户态 重启被中断的system call用户信号执行完毕如何返回?
if (signal_pending(current)) { // 自定义信号处理函数 } flush_signals(current);
转载地址:http://rjigi.baihongyu.com/