信号SIGFPE问题

我是Linux新手,请帮忙。 以下代码在Linux 2.6 gcc中运行时获得核心转储。

$ ./a.out
浮点exception(核心转储)

问题:
1.由于安装了过程信号掩码,因此不应该禁止第40行(z = x / y)生成的“SIGFPGE”
2.如果未被阻止,由于已经安装了一个信号处理程序,不应该由信号处理程序捕获“SIGFPE”,而不是核心转储?
3.如果我将第40行(z = x / y)注释掉,并使用第42行(raise(SIGFPE)),那么所有事情都按我的预期工作。 这里有什么区别x / 0和提高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; //raise(SIGFPE); printf("point 1000\n"); return 0; } 

Solutions Collecting From Web of "信号SIGFPE问题"

信号被阻塞时由硬件陷阱引起的任何SIGFPE都会导致未定义的行为:

如果SIGFPE,SIGILL,SIGSEGV或SIGBUS信号在被阻塞时产生,结果是未定义的,除非信号由kill()函数,sigqueue()函数或raise()函数产生。

(来自sigprocmask规范 )