linux中进程1向进程2发送信号,要经过内核,内核会维护一个进程对某个信号的状态,如下图所示:
当进程1向进程2发送信号时,信号的传递过程在内核中是有状态的,内核首先要检查这个信号是不是处于阻塞状态,然后检查这个信号是不是处于未决状态,最后检查是不是忽略该信号。
更详细的信号传递过程如下:
一个信号送到进程2时,先检查这个进程是否对这个信号屏蔽,如果屏蔽了,则将block状态字相应的位置为1,表示进程把这个信号是阻塞,然后内核就将pending状态字的相应位置为0,表示信号未抵达,当我们在进程2中调用一个函数将block中的相应位置为0时,pending中的对应位就会被置为1,这时候刚才未达的信号就可以继续往后走了,然后检查进程2对这个信号是不是忽略,如果不是忽略就调用相应的信号处理函数。
下面介绍几个操作信号集的函数:
int sigemptyset(sigset_t *set) 把信号集(64bit)全部清零
int sigfillset(sigset_t *set) 把信号集全部置为1
int sigaddset(sigset_t *set, int signo) 根据signo,把信号集中的相应位置为1
int sigdelset(sigset_t *set, int signo) 根据signo,把信号集中相应的位清0
int sigismember(const sigset_t *set, int signo) 判断signo是否在信号集中