假设我们在C中有一个使用sleep()函数的程序
该程序执行并进入睡眠状态。然后,我们输入Ctrl+ C将SIGINT信号发送到该进程。
我们知道接收到SIGINT时的默认操作是终止该进程,我们也知道每当睡眠进程收到信号时,sleep()函数都会恢复该进程。
我的教科书上说,为了允许sleep()函数返回,我们必须安装一个SIGINT处理程序,如下所示:
void handler(int sig){
return; /* Catch the signal and return */
}
...
int main(int argc, char **argv) {
...
if (signal(SIGINT, handler) == SIG_ERR) /* Install SIGINT handler */
unix_error("signal error\n");
...
sleep(1000)
}
虽然代码看起来很简单,但是如果我想更深入地研究,我仍然有疑问:
背景:当进程处于hibernate状态时,我们键入Ctrl+ C发送SIGINT
问题1:我的理解是,内核通过更新在插入位向量中SIGINT的对应挂起位将SIGINT发送到进程,我的理解正确吗?
问题2:处理器检测到SIGINT的存在,但是由于我们覆盖了处理程序以使其返回而不是终止进程,因此我们的处理程序被执行,然后内核清除SIGINT的对应挂起位,我的理解正确吗?
Q3-由于SIGINT的相应挂起位被清除,那么sleep()函数如何返回?我认为应该仍然处于睡眠状态,因为从理论上讲,sleep()函数无法知道SIGINT的存在(已清除)