信号
异步通信机制
不可靠/可靠
信号处理方式
忽略
捕捉
默认
常见信号默认用途
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()
dequeue_signal 从信号pending队列中,取出优先级最好的信号
ka = &sighand->action[signr-1]; 从信号处理数组sighand中,取出信号对应的处理函数
ka->sa.sa_handler == SIG_IGN : continue
ka->sa.sa_handler != SIG_DFL : break ;
其他
一部分 sig_kernel_ignore
一部分 sig_kernel_stop
一部分 sig_kernel_coredump->do_coredump
一部分 do_group_exit
handle_signal()
compat_setup_frame
user_fastforward_single_step
重启被中断的system call
用户信号执行完毕如何返回?
if (signal_pending(current))
{
}
flush_signals(current);