9
我是Linux新手,請幫忙。 以下代碼在Linux 2.6 gcc中運行時會獲得核心轉儲。SIGFPE信號問題
$ ./a.out
浮點異常(核心轉儲)
的問題:
1.由於安裝過程信號掩模,應該不是 「SIGFPGE」 通過線中產生40(z = x/y)被阻擋?
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;
}
1。雖然最新的規範是[問題7](http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigprocmask.html)。 :-) – Nemo
@Nemo:謝謝。規則仍然存在,但措辭略有改變,所以我更新了答案。 –
感謝您的答案。我討厭「未定義」。 –