我是 Linux 信号的新手,请帮忙。
当在 Linux 2.6 gcc 上运行以下代码时会出现核心转储:
$ ./a.out
Floating point exception (core dumped)
问题如下:
1. 由于进程信号掩码已安装,volatile int z = x/y;
的第40行生成的 "SIGFPGE" 是否应该被阻止?
2. 如果没有被阻止,由于已安装信号处理程序, "SIGFPE" 应该被信号处理程序捕获,而不是导致核心转储吗?
3. 如果我注释掉第40行的volatile int z = x/y;
,并使用第42行的 raise(SIGFPE);
,则一切都按照我的预期工作。在这里,x/0 和 raise SIGFPE 之间有什么区别?
以下是代码:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void sig_handler(int signum)
{
printf("sig_handler() received signal %d\n", 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\n");
return 0;
}