我是Linux信号的新手,请帮忙.

在Linux 2.6 gcc中运行时,以下代码会获取核心转储.

$./每年

浮点异常(核心已转储)

问题:

1.由于已安装过程信号屏蔽,因此不应由第40行的volatile int z = x / y生成的“ SIGFPGE”;被封锁?

2.如果未阻塞,则由于已经安装了信号处理程序,信号处理程序是否应该捕获“ SIGFPE”而不是内核转储?

3.如果我注释掉第40行volatile int z = x / y ;,并使用第42行raise(SIGFPE);相反,一切都会按我的预期进行. x / 0和在此处提高SIGFPE有什么区别?

这是代码:

#include

#include

#include

void sig_handler(int signum)

{

printf("sig_handler() received signal %d

", signum);

}

int main(int argc, char * argv[])

{

// setup signal mask, block all signals

sigset_t set;

sigfillset(&set);

if(sigprocmask(SIG_BLOCK, &set, NULL)<0)

{

perror("failed to set sigmask");

return -1;

}

// install signal handler for SIGFPE

struct sigaction act;

act.sa_handler = sig_handler;

act.sa_mask = set;

act.sa_flags = 0;

if(sigaction( SIGFPE, &act, NULL)<0)

{

perror("sigaction failed");

exit(-1);

}

volatile int x =1;

volatile int y =0;

volatile int z = x/y; //line 40

//raise(SIGFPE); //line 42

printf("point 1000

");

return 0;

}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐