Linux系统下的信号
一、信号概念
1. 什么是信号
信号是软件中断,信号提供了一种异步处理事件的方法,它允许进程和内核中断其他进程。一个信号就是一条消息,它通知进程系统发生了一个某种类型的事件,在Linux系统中支持31中不同类型的信号
在我这篇文章中给大家列出了Linux系统支持的31个信号(https://blog.youkuaiyun.com/qq_34934140/article/details/116550027)。
每种信号都对应不同的系统类型,底层硬件异常是由内核异常处理程序处理的,正常情况下对用户是不可见的,信号提供了一种机制,通知用户进程发生了这些异常。每个信号都有自己的名字,他们都是以SIG开头,这些信号都包含在<signal.h>中。
产生信号的事件相对于进程来说是不可预见的,所以进程不可以测试一个变量来判断信号的产生,而必须告诉内核当信号发生时进程该如何处理。在信号出现时有以下三种处理方式
1)忽略信号,大多数信号采用这种处理方式,但是有两种信号不可用忽略,SIGKILL 和 SIGSTOP,因为他们向内核和超级用户提供了可靠的进程终止或停止的方法。
2)捕捉信号,通知内核在信号发生时调用一个用户函数,在用户函数中执行用户希望对该事件的处理方式。同样SIGKILL 和 SIGSTOP不可以被捕捉。
3)执行默认动作,系统会给所有信号一个默认动作,在(https://blog.youkuaiyun.com/qq_34934140/article/details/116550027)里面我已经详细列出。
2.信号术语
1)发送信号
内核通过更新目的进程上下文中的某个状态,发送一个信号给目的进程。发送信号的原因
a. 内核检测都一个系统事件,如硬件异常或子程序终止
b. 一个进程调用kill函数,显示地要求内核发送一个进程给目的进程,或者进程自己给自己发送信号。
2)接收信号
当目的进程被内核强迫以某种方式对信号的发送做出反应时,它就接收了信号。进程可以忽略这个信号也可以捕捉它做一个信号处理函数。
3)待处理信号
一个发出而没有被接收的信号,任一时刻,一种类型最多只会有一个待处理信号,如果一个进程此时有一个类型为k的处理信号,那么接下来发送到此进程的所有k类型信号都不会排队等待
,他们都会被丢弃,进程可以选择阻塞接收某种信号,当一个信号被阻塞时,它仍然可以被发送,但是不会被接收,所有产生了待处理信号,直到进程取消对该进程的阻塞。一个待处理信号最多被
接收一次,在内核中有一个pending位向量维护着待处