信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些事件。
它可以在任何时候发给某一进程,而无需知道该进程的状态。如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它为止;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。
每个进程收到的信号,都是由内核负责发送的,内核处理。
递达并且到达进程
产生和递达之间的状态,主要由于阻塞(屏蔽)导致该状态
将某些信号加入集合,对他们设置屏蔽,当屏蔽XX信号后,再收到该信号,该信号的处理将退后直到解除屏蔽。
1.信号产生,未决信号集中描述该信号的位立即翻转为1,表示信号处于未决状态。当信号被处理对应位后翻转回为0,这一时刻往往非常短暂 2.信号产生后,由于某些原因(主要是阻塞)不能递达。这类信号的集合称为未决信号集。在解除屏蔽前,信号一直处于未决状态。
特别注意:9)SIGKILL 和 19)SIGSTOP信号,不允许忽略和捕捉,只能执行默认动作。设置不错将其设为阻塞
发送信号的函数主要有 kill()、raise()、alarm()以及 pause()。
kill( ) 可以发送信号给进程或进程组
raise( )只允许进程向自身发送信号
alarm 也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它就向进程发送 SIGALARM 信号。
pause 函数是用于将调用进程挂起直至捕捉到信号为止。这个函数很常用,通常可以用于判断信号是否已到。
信号处理的主要方法有两种,一种是使用简单的 signal 函数和sigaction函数,另一种是使用信号集函数组。
struct sigaction { void (*sa_handler)(int signo); //捕捉到信号后处理函数 sigset_t sa_mask; //捕捉处理函数执行期间对哪些信号进行屏蔽 int sa_flags; //默认等于0时,只对本信号进行屏蔽 void (*sa_restore)(void); }注意:这两个函数注册信号捕捉函数,真正抓捕信号的是内核
sigpending函数用于读取未决信号集的状态。