信号保存
信号产生后,操作系统将信号发给进程,进程就要保存信号。
为什么信号要保存?
因为进程收到信号后,可能在忙其他事情,不会立即处理信号,就产生了时间窗口
相关概念
- 实际处理信号的过程叫信号递达(Delivery)
- 信号产生到处理的过程叫做信号未决(Pending)
- 进程可以**阻塞(Block)**某个信号,
- 被阻塞的信号将保持在未决状态
- 被阻塞和忽略是不一样的,被阻塞是递达不了,忽略是信号递达后的一种处理方式
内核三张表

进程 PCB 里面指向三张表,一张阻塞表 block,一张未决表 pending,一张处理方式 handler 表
阻塞状态信号不会被处理,直到解除阻塞状态
也就是说 2 号信号会一直保持此状态,直到 block 解除,pending 就会被处理
3 号信号 block 为 1,阻塞,现在的状态是从未收到过信号,如果收到信号 pending 会置 1
每个信号都有自己的默认处理方式

如图所示,1 号信号默认处理
2 号信号,忽略处理
signal(SIGINT,SIG_DFL); 恢复 2 号 signal(SIGQUIT,SIG_IGN); 将 3 号忽略

handler 表中存的函数指针,每个函数指针指向一个信号处理方式
void printpending(sigset_t &pending) {
for (int i = 31; i >= 1; i--) {
if (sigismember(&pending, i)) { cout << 1; }
else { cout << 0; }
}
cout << endl;
}
int {
bset, oset;
(&bset);
(&oset);
(&bset, );
pending;
() {
n = (&pending);
(n < ) ;
(pending);
();
}
;
}






