当前位置: 技术问答>linux和unix
关于signal与setjmp的配合使用时遇到的一个问题
来源: 互联网 发布时间:2016-12-29
本文导语: 代码如下: jmp_buf env; void handle() { printf("catch the signal!n"); longjmp(env,1); } int main() { signal(SIGFPE,handle); if(setjmp(env) != 0) { printf("first!n"); } printf("second!n"); kill(0,SIG...
代码如下:
jmp_buf env;
void handle()
{
printf("catch the signal!n");
longjmp(env,1);
}
int main()
{
signal(SIGFPE,handle);
if(setjmp(env) != 0)
{
printf("first!n");
}
printf("second!n");
kill(0,SIGFPE);
printf("third!n");
return 0;
}
运行结果:
second!
catch the signal!
first!
second!
third!
小弟有一事不明,按理说第二次second之后应该再次掉用kill,为什么没有,而是直接跳过去了呢,麻烦高手解答一下。
jmp_buf env;
void handle()
{
printf("catch the signal!n");
longjmp(env,1);
}
int main()
{
signal(SIGFPE,handle);
if(setjmp(env) != 0)
{
printf("first!n");
}
printf("second!n");
kill(0,SIGFPE);
printf("third!n");
return 0;
}
运行结果:
second!
catch the signal!
first!
second!
third!
小弟有一事不明,按理说第二次second之后应该再次掉用kill,为什么没有,而是直接跳过去了呢,麻烦高手解答一下。
|
当收到SIGFPE信号后,进入信号处理函数,此时SIGFPE进入进程的信号屏蔽字,而楼主在信号处理函数中调用longjmp,这样就导致跳转而使SIGFPE依然留在进程的信号屏蔽字里,所以进程第二次不会再响应SIGFPE信号的请求了
|
你这个程序属于碰巧流,第一个kill发出以后,程序会继续往下跑,如果信号处理不及时程序早已经退出了。
你碰巧的是kill之后还没跑到third信号就被处理了,于是就有了你理想中的second->first->second->third。
第二次Kill呢,程序就是没来得及处理信号就结束了,所以就这样。
你碰巧的是kill之后还没跑到third信号就被处理了,于是就有了你理想中的second->first->second->third。
第二次Kill呢,程序就是没来得及处理信号就结束了,所以就这样。