【发布时间】:2011-02-01 13:55:33
【问题描述】:
我只是在 Mac OS X 中玩信号。
为什么在我的信号处理程序完成后,以下代码不会产生 SIGSEGV 的默认行为? 在 Linux 下,代码运行良好。
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
void err_crash();
void my_signal_handler (int signal)
{
fprintf(stderr, "signal == %i\n", signal);
fflush(stderr);
err_crash();
}
void err_crash()
{
static int count= 0;
if (count)
signal(SIGSEGV, SIG_DFL); /* break recursion loop if we recursed */
count++;
// one of the two should really crash ;)
((void)(*((int volatile *)NULL)));
*((int *)NULL) = 42;
abort(); /* in case we're not crashed yet... */
}
int main ()
{
signal(SIGSEGV, my_signal_handler);
err_crash();
return 0;
}
编辑: 我得到的输出如下:
bonecrusher:devel sw$ g++ signal_problems.cpp -o foo
bonecrusher:devel sw$ ./foo
signal == 11
^C
bonecrusher:devel sw$
问题是我希望程序在signal == 11 的输出之后终止,但它永远运行,我不得不中断它。
【问题讨论】:
-
你为什么期望 ((void)(*((int volatile *)NULL)));坠毁?您不要将其用作左值或右值或函数指针的调用。 volatile 无济于事,因为您什么也没做。
-
@datenwolf:这不是问题,看我的编辑。
-
奇怪。我的 Mac 上只有
Bus error。