2.3 linux中的信号分析 阻塞、未达

  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是否在信号集中

猜你喜欢

转载自www.cnblogs.com/wanmeishenghuo/p/9375211.html
2.3
今日推荐