linux中 ,signal注册的handler, 执行结束后会将阻塞集恢复为进入handler前的状态吗?

wanghaiyang1996 2017-05-08 09:45:30
如题。
代码:在main()中使用sigprocmask()设置A信号阻塞。然后使用signal()为B信号设置
handler(),在handler()中取消A信号的阻塞。
运行:发送B信号,会发现A信号的阻塞只取消了一下,之后又恢复阻塞状态。不解,考虑有可能是handler()结束时又将阻塞集恢复为进入handler()之前的状态,网上找不到相关资料,求大神解答。。。


void handler(int num)
{
if(num == SIGINT)
{
cout << "SIGINT" << endl;
} else if(num == SIGQUIT)
{
cout << "SIGQUIT" << endl;
}
}

int main(int arg, char* args[])
{
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGINT);
sigprocmask(SIG_BLOCK, &sigset, NULL);

signal(SIGINT, handler);
signal(SIGQUIT, handler);

while(1)
{
}

return 0;
}


实际结果:运行后发送SIGINT信号,被阻塞。发送SIGQUIT信号后, 之前被阻塞的SIGINT信号抵达。但是之后的SIGINT信号又被阻塞了。
我的设想:运行后发送SIGINT信号,被阻塞。发送SIGQUIT信号后, 之前被阻塞的SIGINT信号抵达。并且之后的SIGINT不会再被阻塞。

为什么实际结果和我的设想有偏差,求解答。。。
...全文
624 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
codingMozart 2017-05-09
  • 打赏
  • 举报
回复
the system restores the mask that was in place before the handler was entered. 应该是退出信号处理函数之后会恢复之前的信号屏蔽

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧