1.信号是怎么产生的?
可以由内核,进程产生
2.信号怎么发送到进程?
2.1.发送进程->内核
所有信号都需要通过内核发送,内核在收到信号后会对其参数进行检测(这个进程能不能发送这个信号…)。校验通过后,将信号数据(信号值,产生原因,发送者进程ID)拷贝到内核空间.然后再发送给对应的进程。
2.2.内核到->接受进程
早期UNIX版本,进程保存了一份未处理信号的位图。当内核发送信号到进程时,先检测进程是否对该信号未处理,时则丢弃当前信号。这样的信号称为不可靠信号。不可靠信号每次执行完都会恢复默认行为(需要重复注册).
在以后linux 版本中对其进行了改进。内核发送信号到进程时,将其保存到信号队列中。但是为了兼容以前的版本对0-31的信号还是保持原有的处理。
3.信号处理过程??
进程从内核态切换到用户态前,检测是否有信号需要处理,如果有且没有被阻塞就会调用相应的信号处理程序去处理。
首先,内核在用户栈上创建一个frame,frame中将返回地址设置成信号处理函数的地址,这样,从内核返回用户态时,就会执行这个信号处理函数。
当信号处理函数执行完,会再次进入内核,检测有没有没处理完的信号,和恢复用户栈。
4.信号处理的几种处理方式?
默认操作
用户自定义操作
忽略 SIGKILL,SIGSTOP 不可忽略