Joh*_*ane 10 c linux signals sigfpe
我是Linux信号的新手,请帮忙.以下代码在Linux 2.6 gcc中运行时获得核心转储.
$ ./a.out
浮点异常(核心转储)
问题:
1.由于安装了过程信号掩码,第40行(z = x/y)生成的"SIGFPGE"是否应该被阻止?
2.如果没有阻塞,由于已经安装了信号处理程序,信号处理程序不应该捕获"SIGFPE"而不是核心转储?
3.如果我注释掉第40行(z = x/y),并使用第42行(加注(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; //line 40
//raise(SIGFPE); //line 42
printf("point 1000\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
信号被阻止时由硬件陷阱引起的任何 SIGFPE 都会导致未定义的行为:
如果任何 SIGFPE、SIGILL、SIGSEGV 或 SIGBUS 信号在被阻塞时生成,则结果未定义,除非该信号是由 Kill() 函数、sigqueue() 函数或 raise() 函数生成的。
(来自sigprocmask
规格)
归档时间: |
|
查看次数: |
5152 次 |
最近记录: |