【问题标题】:Why signal handler goes to infinite loop? - SIGSEGV为什么信号处理程序进入无限循环? - SIGSEGV
【发布时间】:2023-03-29 14:00:01
【问题描述】:

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

这里是代码。 请帮帮我。

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

【问题讨论】:

  • 只有我一个人,还是你没有发布整个for循环?也许更进一步,你正在对i 做一些事情,我相信你已经在全球范围内宣布了它,仅此一项就是一件坏事
  • 您无法在信号处理程序中可靠地调用 printf。您不能可靠地从 SIGSEGV 的处理程序返回(您应该退出)。
  • 不,我不能退出..因为在我的情况下,我需要捕捉它要处理的时间间隔(可能是 3 到 6 秒)。
  • @SS 'Kain':代码的另一部分与问题无关。

标签: c linux


【解决方案1】:

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 的每条指令,都会调用此处理程序并重新启动指令。但是您的处理程序一开始就没有解决错误指令的问题。

总之,当指令重新启动时,它会再次出错。一次又一次……你明白了。

【讨论】:

  • 但我希望:在错误指令中,处理程序将被调用,并且在返回时它应该转到下一行代码,对吧? (下一行我的意思是错误指令之后的行)
  • @kingsmasher1 不。它不会转到下一行。它尝试再次执行当前指令。
  • @kingsmasher1:在目标代码中,没有“下一行”的概念。这只是处理器指令。
  • @kingsmasher1 顺便说一句,您确实意识到从信号处理程序调用 printf 是不安全的,对吧?
  • 如果它转到下一行而不是重新启动被中断的指令(由于异常而没有完成),请考虑正常的信号处理将如何工作:将收到一个信号,导致当前指令不仅会被打断,还会被错过......想象一下尝试调试它! SIGSEGV 处理程序只是信号处理程序,用于处理系统发送的信号。
【解决方案2】:

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

进程从信号捕获函数正常返回后的行为是不确定的/p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2011-04-19
    • 1970-01-01
    • 2012-01-07
    相关资源
    最近更新 更多