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

时间:2011-08-08 11:18:06

标签: c linux

知道为什么信号处理程序会进入无限循环吗?

这是代码。 请帮帮我。

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);

2 个答案:

答案 0 :(得分:16)

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的指令,此处理程序称为,并且指令重新启动。但是你的处理程序没有做任何事情来解决错误指令的错误。

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

答案 1 :(得分:7)

http://pubs.opengroup.org/onlinepubs/009604599/functions/xsh_chap02_04.html#tag_02_04

  

在正常从信号捕获函数返回的信号捕获函数中,进程的行为是未定义的,该函数不是由kill(),sigqueue()或raise()生成的SIGBUS,SIGFPE,SIGILL或SIGSEGV信号。 / p>