2011-08-08 85 views
5

任何想法为什么信号处理程序进入无限循环?为什么信号处理程序进入无限循环? - SIGSEGV

这是代码。 请帮帮我。

enter code here 
9 void SIGSEGV_handler(int signal) 
10 { 
11 printf("Segmentation fault caught....\n"); 
12 printf("Value of instance variable: i = %d\n\n", i); 
13 } 
16 
17 int main() 
18 { 
19 char *mallocPtr, *callocPtr, *reallocPtr, *memalignPtr, *vallocPtr; 
20 struct sigaction sa; 
21 
22 sa.sa_handler=SIGSEGV_handler; 
23 sigaction(SIGSEGV, &sa, NULL); 
24 
37 
38 printf("The segmentation fault handler will be entered for i = 3, 4, 5 and 6\n"); 
39 
40 
41 for(i=0; i<7; i++) 
42 { 
43 printf("i = %d\n",i); 
44 
45 mallocPtr=(char*)malloc(3); 
46 printf("Malloc address : %x\n",mallocPtr); 
47 strcpy(mallocPtr, "Hhvhgvghsvxhvshxv"); 
48 puts(mallocPtr); 
+0

难道只是我,还是你没有发布整个'for'循环?也许更进一步,你正在为'i'做些事情,我相信你在全球范围内宣布它,这是一件坏事 – Djole

+0

你不能在信号处理程序中可靠地调用printf。您无法可靠地从SIGSEGV的处理程序返回(您应该退出)。 –

+0

不,我不能退出..因为在我的情况下,我需要赶上它将要处理的时间间隔(可能是3到6秒)。 – kingsmasher1

回答

14

SIGSEGV的默认行为是终止你的进程。但你安装一个处理程序,并覆盖此:

/* Does nothing to "fix" what was wrong with the faulting 
* instruction. 
*/ 
void SIGSEGV_handler(int signal) 
{ 
    printf("Segmentation fault caught....\n"); 
    printf("Value of instance variable: i = %d\n\n", i); 
} 

所以对于每一个触发SIGSEGV指令,该处理器被称为和指令重新启动。但是你的处理程序并没有采取任何措施来解决错误指令首先出现的问题。

总之,当指令重新启动时,它会再次发生故障。再一次,然后......你明白了。

+0

但我希望:在错误的指令中,处理程序将被调用,并返回它应该去下一行代码,对吧? (下一行我的意思是,错误指令后的行) – kingsmasher1

+0

@ kingsmasher1不。它不会到下一行。它试图再次执行当前指令。 – cnicutar

+3

@ kingsmasher1:在目标代码中,没有“下一行”的概念。这只是处理器指令。 –