【发布时间】:2018-11-18 01:06:18
【问题描述】:
我遇到了在分段错误处理程序中引发分段错误的问题。虽然我已经解决了实际问题,但我仍然很困惑为什么下面的程序没有进入无限循环:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void C()
{
int *p = NULL;
*p = 3;
}
void B()
{
C();
}
void segfault_sigaction(int signal, siginfo_t *si, void *arg)
{
printf("Came in sigaction.\n");
//if(si)
//printf("Caught segfault at address %p\n", si->si_addr);
B();
}
int main(void)
{
struct sigaction sa;
memset(&sa, 0, sizeof(struct sigaction));
sigemptyset(&sa.sa_mask);
sa.sa_sigaction = segfault_sigaction;
sa.sa_flags = SA_SIGINFO;
sigaction(SIGSEGV, &sa, NULL);
segfault_sigaction(0, NULL, NULL);
return 0;
}
以上代码的输出如下:
Came in sigaction.
Came in sigaction.
Segmentation fault (core dumped)
在这个类似帖子的 cmets 中:Segmentation fault within segmentation fault handler 一些人评论说它应该进入无限循环,但这不是当前的行为。有人可以向我解释发生了什么吗??
【问题讨论】:
-
见What happens if I catch SIGSEGV and the signal handler causes another SIGSEGV 和Segfault in SIGSEGV handler。简短的回答是您必须设置 SA_NODEFER 以获得您想要的行为。
-
@MarkPlotnick 谢谢马克你的回答完全阐明了我的程序发生了什么。
标签: c linux debugging linux-kernel operating-system