免费注册 查看新帖 |

Chinaunix

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

alarm函数为何没有被信号处理函数中断 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-13 13:15 |只看该作者 |倒序浏览
#include<apue.h>
#include<unistd.h>
#include<stdlib.h>
#include<setjmp.h>
#include<sys/wait.h>
#include<pwd.h>

static void sig_alrm(int);
static void sig_int(int);

int main()
{
        if(signal(SIGALRM,sig_alrm)==SIG_ERR)
                printf("signal(SIGALRM) error\n");
                if(signal(SIGINT,sig_int)==SIG_ERR)
                        printf("signal(SIGALRM) error\n");
        alarm(10);
        pause();
        return 0;
}

static void sig_alrm(int signo)
{
        printf("alarm is called\n");
}


static void sig_int(int signo)
{
        printf("starting interrupt\n");
        pause();
}


这个程序运行时,按ctrl c然后执行中断处理程序,为什么alarm函数在运行时没有被中断,而是在程序挂起后仍产生SIGALRM信号。

论坛徽章:
0
2 [报告]
发表于 2009-02-13 14:52 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2009-02-13 14:58 |只看该作者
因为你的SIGINT处理函数里有pause(), 这个使得SIGINT处理函数无法返回,知道alarm(10)的10秒过了以后,产生SIGALRM信号,这个SIGALRM信号调用SIGALRM处理函数,这个函数返回后使SIGINT 处理函数内的pause()返回,从而SIGINT 处理函数返回

你的SIGINT信号没有唤醒你的alrm(10)后面的pause()是因为只有从SIGINT处理函数返回后才会使pause()返回,而你的SIGINT信号处理函数里有一个pause(),它要等待某个信号唤醒它

论坛徽章:
0
4 [报告]
发表于 2009-02-13 15:00 |只看该作者
建议你在你的SIGINT信号处理函数返回之前打印“sig_int returned\n"类似的提示信息,这样比较好理解

论坛徽章:
0
5 [报告]
发表于 2009-02-13 15:35 |只看该作者
我的意思是alarm(10)先执行,然后主程序挂起,在这时键入中断,为什么没有中断alarm函数

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
6 [报告]
发表于 2009-02-13 15:38 |只看该作者
有可能是一个信号处理函数执行过程过屏蔽了其他信号,导致pause无法被终止,猜的

论坛徽章:
0
7 [报告]
发表于 2009-02-13 15:57 |只看该作者
因为还没有从SIGINT处理函数返回啊,只有从信号处理函数返回,才会使得main中的pause()返回
你连续按多次CTRL+C也不能从sig_int 返回,这是因为在sig_int处理函数执行的时候,SIGINT信号是屏蔽掉的
如果你按CTRL+C 然后按ctrl+\ 就可以做到返回你main()中的pause,最好写一个SIGQUIT的处理函数

论坛徽章:
0
8 [报告]
发表于 2009-02-13 16:11 |只看该作者
多谢耐心指导,我又改了下,现在明白了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP