我能够处理一次分段错误。但是当它再次发生时会导致分段错误。是否有可能多次处理sigsegv信号?
#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_handler\n");
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("%d\n", *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错误。
答案 0 :(得分:2)
一旦出现Segmentation故障,并且您处理异常,但您没有恢复原因。赌注将是避免seg错误。在您的示例程序中,您有指针a
,b
但未分配,因此,a
,b
包含垃圾(未分配),访问*a
因此存在风险,导致seg故障。
相反,为a
,b
分配足够的空间,例如,
a = (int *) malloc(sizeof (int));
同样,b
。
完成后不要忘记解除分配,例如,
free(a);
答案 1 :(得分:1)
您无法使用C ++ try / catch块来处理信号,因为POSIX 信号与C ++ 例外不同>。例如, signals 是异步的,由内核触发,而C ++ 例外是同步的:
您需要特别注意编写处理函数,因为 它们可以异步调用。也就是说,可能会调用一个处理程序 在程序的任何一点,不可预测。如果两个信号到达 在很短的时间间隔内,一个处理程序可以在另一个处理程序中运行。
您可以找到有关如何编写正确信号处理程序的here的更多信息。看看volatile sig_atomic_t