在下面的代码中,我正在处理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;
}
答案 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()
来安装信号处理程序。