2014-04-19 36 views
0

我不知道为什么这个程序crashs当报警处理共完成其工作,由于malloc的声明(LINE-1),虽然它从未被称为的malloc分段故障时,报警处理程序共完成

当我评论LINE1 LINE2 OR代码继续没有任何问题,但评论LINE3当程序仍然crashs

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

void handler (int sig) { 
    printf ("Hi I'm at handler\n"); 
} 

int main() { 
    int *pm, f = 0; 

    struct sigaction sa; 

    sa.sa_handler = &handler; 

    sigaction (SIGALRM, &sa, NULL); 

    alarm (2);  // LINE1 

    while (1) { 
      if (f == 1)  { 
        pm = (int *) malloc (sizeof (int));  // LINE2 
        if (pm) 
          printf ("memory allocated at loop\n"); 
      } 
      else { 
        printf ("Wait\n"); 
        usleep (200000);      // LINE3 
      } 
    } 

return 0; 
} 

结果:

Wait 
Wait 
Wait 
Wait 
Wait 
Wait 
Wait 
Wait 
Wait 
Wait 
Hi I'm at handler 
Segmentation fault (core dumped) 

注:

这个问题面临的我,可以让我写了这个程序,以显示它 我工作在Ubuntu下,并用gcc编译不能在这里发表较大的应用程序

+0

在信号处理程序中使用printf(和任何'睡眠'功能)不是一个好主意 –

+1

阅读[如何避免在信号处理程序中使用printf?](http://stackoverflow.com/questions/16891019/how -to-avoid-using-printf-in-a-signal-handler),它也回答了为什么要避免。 –

回答

1

有将近什么你可以在做信号处理程序,几乎所有原因都会导致未定义的行为
C标准唯一保证的是设置volatile sig_atomic_t
POSIX标准允许相当多的其他功能,但不是printf

尤其是,printf() -all可能会中断其他访问相同的输出流和其他内存分配请求,导致无限制的破坏。

“nos”评论说,使用大多数未初始化的结构调用sigaction也不是最明智的决定。

+2

也是struct sigaction sa;没有正确初始化,那里有更多的成员比sa_handler。更好的memset(&sa,0,sizeof sa); – nos

+0

是的,初始化结构解决了问题,thx –

+1

@MohamedYacoutAbouSamra:请说你也读了另一部分。海森虫非常有趣。 – Deduplicator