伙计们,我想处理像SIGSEGV这样的信号,但仍然会使应用程序崩溃,因此我可以获得核心转储。
在我的方法中,在我的信号处理程序中,我取消注册信号处理程序,因此我可以使应用程序崩溃而不是进入循环,下面是示例代码:
#include <iostream>
#include <csignal>
#include <unistd.h>
using namespace std;
void signalHandler( int signum )
{
signal(SIGFPE, SIG_DFL);
raise(signum); // <-- should I keep this line?
}
int main ()
{
signal(SIGFPE, signalHandler);
int a, b=2, c=0;
a=b/c;
return 0;
}
现在问题:
我不确定是否应该保留raise
行。做了一些测试我发现如果我保留或不保留这两种情况,我会让gdb指向有问题的行a=b/c;
,但是我不太明白。
有意义的是,如果我不调用raise
,将在信号处理程序之后重新执行违规行,因此我将获得我期望的核心转储,但是如果我手动调用{{ 1}}我所期望的是违规行是调用raise
的行。有人可以对此有所了解吗?