免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1331 | 回复: 5
打印 上一主题 下一主题

[C] 为什么解除SIGINT阻塞和pause之间发生的SIGINT信号会丢失? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-04-15 21:47 |只看该作者 |倒序浏览
APUE书上这么说,我感觉解除以后不管pause前pause后发生SIGINT都应该执行默认的中断终止吧?为何书上说信号丢失呢?

#include "apue.h"
#include <signal.h>

int
main(void)
{
        sigset_t         newmask, oldmask;
       
        sigemptyset(&newmask);
        sigaddset(&newmask, SIGINT);
       
        if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
                err_sys("SIG_BLOCK error");
       
        sleep(5);
       
        if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
                err_sys("SIG_SETMASK error");

        pause();

        exit(0);

}
实验结果我在5秒内和5秒后按一次ctrl-c都能够中断程序的啊?书上说错了?

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
2 [报告]
发表于 2016-04-15 22:05 |只看该作者
程序看起来貌似没什么问题,你确定5秒内可以Ctrl-C中断?

论坛徽章:
0
3 [报告]
发表于 2016-04-15 22:23 来自手机 |只看该作者
本帖最后由 fmjz_qs214 于 2016-04-15 22:25 编辑

我确定可以的,5秒内按是约延迟到5秒中断,5秒后按是立刻中断。不过我刚才搜索了一下,有人问过这个问题,得到的解释是书上说的丢失信号不是说信号没被处理,而是因为在pasue前被处理,相对于pasue而言没有等到这个信号就消失了,这个丢失不是真正意义上的丢失,不知道这个解释是否合理?

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
4 [报告]
发表于 2016-04-15 22:41 |只看该作者
回复 3# fmjz_qs214

被block的信号会等到unblock的时候再处理,不会“丢弃”。
所谓“信号丢失”,我猜书上的意思是多一个SIGINT只会deliver最后一个,也就是说你在5秒内多次按下ctrl-c,5秒过后signal handler只会激活一次。

论坛徽章:
0
5 [报告]
发表于 2016-04-17 07:35 来自手机 |只看该作者
哦,就是说阻塞的信号不排队吧

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
6 [报告]
发表于 2016-04-17 12:00 |只看该作者
回复 5# fmjz_qs214

只有realtime signal才会排队。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP