一、信号的捕捉
1.从用户态到内核态
在Linux当中,在执行主控制流的指令时被中断、异常或者系统调用时,此时程序会进入到内核态,目前为止,信号还没有被处理。
2.从内核态到用户态
程序进入内核态并处理完之后,正常情况没有信号的话,程序会直接回到程序中断的执行流处继续执行程序。注意!如果此时已经有信号产生并没有被阻塞或忽略的话,程序在内核态返回用户态的这一过程中,会处理产生的信号。
二、信号的处理方式
1.默认信号处理方式
如果捕捉到信号后,没有自定义该信号处理函数,系统会自动调用默认的函数处理信号,比如SIGINT,其默认处理方式就是结束当前前台所执行的进程,包括它的所有子进程。期间处理在内核态。
处理完毕后,将返回到用户态继续执行执行流。
2.自定义信号处理方式
如果捕捉到信号后,自定义了该信号处理函数(SIGKILL和SIGSTOP除外,这两类信号处理方式无法被自定义),系统会先回到用户态,进而直接去调用自定义的信号处理函数。
之后,系统将再次回到内核态,最后再从内核态转变到用户态回到之前中断的执行流。
三、总结
总结只有一句话,信号的捕捉就是从内核态转到用户态这一过程中进行,返回用户态时顺带检查是否有未处理的信号,如果有,则调用相应的函数处理,之后将回到用户态。