报警处理程序完成时malloc分段故障

时间:2014-04-19 17:33:08

标签: c linux malloc alarm

我不知道为什么这个程序在报警处理程序完成其工作时崩溃,因为malloc语句(LINE1)虽然它从未被调用过

当我评论LINE1或LINE2时代码继续没有任何问题,但在评论LINE3时程序仍然崩溃

#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编译

1 个答案:

答案 0 :(得分:1)

在信号处理程序中几乎没有任何事情可做,几乎所有事情都会导致未定义的行为
C标准唯一保证的是设置volatile sig_atomic_t POSIX标准允许很多其他功能,但不允许printf

特别是,printf()调用可能会中断对同一输出流和其他内存分配请求的其他访问,从而造成无限制的破坏。

正如“nos”评论的那样,使用一个大部分未初始化的结构来调用sigaction也不是最明智的决定。