Linux下捕捉信号
关于 信号signal的知识铺垫 点这里 信号由三种处理方式: 忽略 执行该信号的默认处理动作 捕捉信号 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个自定义函数,这称为 捕捉信号 。 进程收到一个信号后不会被立即处理,而是在恰当时机进行处理!即 内核态返回用户态之前 ! 但是由于信号处理函数的代码在用户空间,所以这增加了内核处理信号捕捉的复杂度。 内核实现信号捕捉的步骤: 用户为某信号注册一个信号处理函数sighandler。 当前正在执行主程序,这时候因为中断、异常或系统调用进入内核态。 在处理完异常要返回用户态的主程序之前,检查到有信号未处理,并发现该信号需要按照用户自定义的函数来处理。 内核决定返回用户态执行sighandler函数,而不是恢复main函数的上下文继续执行!(sighandler和main函数使用的是不同的堆栈空间,它们之间不存在调用和被调用的关系,是两个独立的控制流程) sighandler函数返回后,执行特殊的系统调用sigreturn从用户态回到内核态 检查是否还有其它信号需要递达,如果没有 则返回用户态并恢复主程序的上下文信息继续执行。 signal 给某一个进程的某一个信号(标号为signum)注册一个相应的处理函数,即对该信号的默认处理动作进行修改,修改为handler函数指向的方式; #include <signal.h>