免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: xiaozhu2007
打印 上一主题 下一主题

[C] APUE2中信号交互处理的问题 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2007-12-27 15:34 |显示全部楼层
原帖由 xiaozhu2007 于 2007-12-26 23:17 发表
这是APUE2中程序清单10_6。
APUE2中说当SIGALRM信号中断了其它信号处理程序,则调用longjmp函数会提早终止该信号处理程序。

在本程序中,当程序开始运行后,按下ctrl+c产生SIGINT信号,main捕捉到该信号后调 ...

如lenovo所说,它是被longjmp中断的。
linux中,当一个信号在执行它的hanlder的时候,只会阻塞同类型的信号,例如这里在处理SIGINT,该信号就被阻塞至处理结束。但其它信号还是会打断当前信号的处理的。除非你自己将它屏蔽掉了。
所以这里在sig_int中执行的时候,SIGALRM信号到来,由于先前已设置了它的处理函数,会转入sig_alrm执行。sig_alrm执行了longjmp,跳转到setjmp之后继续执行,也就是SIGALRM信号处理完成,返回。程序继续运行直到结束。所以你应该可以看到 printf("sleep2 returned : %d\n", unslept);的输出。程序是正常执行结束的,被中断的只是SIGINT的处理

论坛徽章:
0
2 [报告]
发表于 2007-12-28 13:06 |显示全部楼层

回复 #7 xiaozhu2007 的帖子

>>1。其中“但其它信号还是会打断当前信号的处理的。除非你自己将它屏蔽掉了。”是不是应该加>>上“或者设置了该信号的处理程序”
>>因为执行下面的程序,一开始按下ctrl+c,程序执行sig_int,当5s后SIGALRM信号被处理程序s>>ig_alrm捕捉的时候,并不打断当前sig_int处理程序。
不,sig_int会被打断。新的信号(非同一个信号)会打断当前信号处理程序的执行。所以你应该看不到printf("after sig_int!\n");这句的输出

论坛徽章:
0
3 [报告]
发表于 2007-12-28 16:41 |显示全部楼层
原帖由 xiaozhu2007 于 2007-12-28 15:41 发表
不对吧,我说的是下面的程序啊!当产生了SIGALRM信号的时候,并没有中断sig_int程序哦!!!

#include
#include
#include

void sig_int(int signo);
void sig_alrm(int signo);

int main(int ar ...

打断的意思是,sig_int还没执行完,就执行sig_alrm去了。所以你应该看到打印出了begin sig_int后接着看到的是caught SIGALRM,最后是end sig_int。打断的意思是暂时中断当前执行,稍后再恢复执行。也就是这里执行的顺序是sig_int --->被打断--->sig_alrm--->接着执行未完成的sig_int。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP