信号的处理
上一节我们主要整理了信号到底是一个什么东西以及产生信号的四种方法,大致包括终端键盘输入、硬件系统故障、系统函数调用和软件条件。那么通过这四种情况给一个进程发送信号后,信号是如何处理的呢?让我们一起分析一下
信号的传递
信号产生之后,如kill函数向一个进程发送信号。发送信号后,首先通过函数find_task_by_vpid找到该该进程,该函数返回是一个进程的task_struct结构,找到目标进程后,内核检查发送信号的进程是否拥有发送信号的权利,通常使用check_keill_permission函数进行查询;然后传递给函数specific_send_sig_info函数处理:该函数主要功能有三个。第一个是调用函数sig_ignored函数检查信号是否被屏蔽,以免浪费时间;注册信号队列,添加到stck_struct结构中;第三步唤醒随眠总的进程。这样信号就已经发送,但是发送后,但还不会触发信号处理程序。
如图:
信号的处理
触发信号处理程序是每次有内核态切换到用户状态是,内核都会发起信号队列处理,最终调用do_signal函数。请注意,该函数中handle_signal函数操作进程在用户状态下的栈,使得在从核心态切换到用户状态之后运行信号执行程序。
进程对信号的响应
1、忽略:就是虽然接收到了该信