在C++中多次处理分段故障

Handle segmentation fault multiple times in C++

本文关键字:处理 分段 故障 C++      更新时间:2023-10-16

我可以处理一次分段故障。但当它再次发生时,会导致分割错误。是否可以多次处理sigsegov信号?

#define _POSIX_SOURCE
#include <signal.h>
#include <stdio.h>
int *a;
class FoobarException
{
  int thingy;
};
void signal_handler(int signum, siginfo_t *info, void *)
{
  printf("signal_handlern");
  FoobarException *f = new FoobarException;
  throw f;
}
void call(int * c)
{
  struct sigaction act;
  act.sa_sigaction = signal_handler;
  sigemptyset (&act.sa_mask);
  act.sa_flags = SA_SIGINFO;
  sigaction (11, &act, NULL);
  try
    {
      printf("%dn", *a);
    }
  catch (FoobarException *f)
    {
      printf("Hello!n");
    }
}
int main()
{ 
  int *b;
  call(b);
  printf("I am here.n");
  call(a);
}

第一个call(b)处理seg故障,但第二个call(a)引发seg故障。

一旦出现Segmentation错误,并且处理了异常,但没有恢复原因。打赌是为了避免seg故障。在您的示例程序中,您有指针ab,但没有分配,因此ab包含垃圾(未分配),因此访问*a是有风险的,会导致seg错误。

相反,为ab(例如)分配足够的空间

a = (int *) malloc(sizeof (int));

类似地,对于b

不要忘记在完成时解除分配,比如

free(a);

您不能使用C++try/catch块来处理信号,因为POSIX的信号常不同。例如,信号是异步的,由内核触发,而C++异常则是同步的:

在编写处理程序函数时需要特别小心,因为它们可以异步调用。也就是说,可能会调用一个处理程序在程序的任何时候,都是不可预测的。如果有两个信号到达在很短的时间间隔内,一个处理程序可以在另一个内运行。

您可以在这里找到关于如何编写正确的信号处理程序的更多信息。看看volatile sig_atomic_t