错误条件已修复仍然在C中获得SIGSEGV

时间:2016-12-22 15:34:53

标签: c signals

在下面的代码中,我正在处理SIGSEGV信号并修复 通过最小化绑定变量的错误条件。我猜每当信号处理程序返回时,它都会重新启动信号发生的指令。在信号处理程序中,我最小化了绑定变量,但仍然获得了SIGSEGV并进入无限循环

不确定我哪里出错了

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>

void SIG_segfault_handler(int);
static int  bound = 5800000;

int main(int argc,char *argv[])
{
    signal(SIGSEGV,SIG_segfault_handler);
    puts("This is the driver code for experimenting with signal");
    int *array = malloc(50);
    *(array+ 23) = 78;
    puts("-------------------------------------------------------------------------------------");
    *(array + bound) = 100;
    printf("Data: %d , %d \n",*(array + 23),*(array + bound));

    puts("Initialiazed array with 50 bytes.. \n End of driver code. ");
    //free(array);
    return 0;
}

void SIG_segfault_handler(int signum)
{
    puts("This is segmentation fault.. cannot continue with the memory operation.. aborting");
    puts("Signal SIGSEGV is handled by the program");   
    puts("Fixing the error conditions..");
    bound = 2;
}

1 个答案:

答案 0 :(得分:0)

根据C和POSIX标准,它是未定义的行为。不允许从SIGSEGV的信号处理程序返回。

请参阅7.14.1.1 The signal function

  

当信号出现并且func指向一个函数时,它就是   实现 - 定义是否相当于signal(sig,SIG_DFL);   执行或实现阻止某些实现定义   一组信号(至少包括sig)发生直到   电流信号处理已完成;在SIGILL的情况下,   或者,实现可以定义不采取任何动作。然后   相当于(* func)(sig);被执行。如果和当时的功能   如果sig的值是SIGFPE,SIGILL,SIGSEGV或任何其他值,则返回   实现定义的值对应于计算   异常,行为未定义;否则程序会   在被中断时恢复执行。

执行信号处理程序后,执行会重新启动导致SIGSEGV的相同指令。这意味着当您溢出数组(导致SIGSEGV)将在返回后再次执行 来自信号处理程序。这应该解释无限循环。

此外,你不应该从信号信号处理程序中调用puts();您只能从信号处理程序中调用异步信号安全函数。有关异步信号安全功能列表,请参阅POSIX manual

由于各种实现提供的语义不同,也不鼓励使用signal()。出于这个原因(其中包括),建议使用sigaction()来安装信号处理程序。