Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
报警处理程序完成时的malloc分段错误_C_Linux_Malloc_Alarm - Fatal编程技术网

报警处理程序完成时的malloc分段错误

报警处理程序完成时的malloc分段错误,c,linux,malloc,alarm,C,Linux,Malloc,Alarm,我不知道为什么这个程序在报警处理程序完成其工作时崩溃,这是由于malloc语句(第1行),尽管它从未被调用过 当我注释第1行或第2行时,代码继续运行,没有任何问题,但是注释第3行时,程序仍然崩溃 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void handler (int sig) { printf ("Hi I'm at

我不知道为什么这个程序在报警处理程序完成其工作时崩溃,这是由于malloc语句(第1行),尽管它从未被调用过

当我注释第1行或第2行时,代码继续运行,没有任何问题,但是注释第3行时,程序仍然崩溃

#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;
}
注:

我在一个更大的应用程序中遇到了这个问题,这个应用程序不能发布在这里,所以我编写了这个程序来展示它
我在Ubuntu下工作,使用gcc进行编译

在信号处理程序中几乎没有任何操作,几乎所有操作都会导致未定义的行为
C标准唯一保证的是设置一个
易失性sig\u原子\u t

POSIX标准允许许多其他功能,但不支持
printf

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


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

在信号处理程序中使用printf(以及任何“休眠”函数)并不是一个好主意,这也回答了为什么要避免的问题;未正确初始化,成员数比sau处理程序多得多。更好的内存集(&sa,0,sa大小)@MohamedYacoutAbouSamra:请说你也读了另一部分。Heisenbug非常有趣。是的,注意到这个有价值的注释,处理程序中的printf语句只是为了testing@Deduplicator问题是信号处理程序可以异步调用(不像普通函数那样调用),标志操作应该是原子的。--此外,你应该让你的程序内存泄漏,因为melloc函数写得太多了。我认为OP应该重新编译程序并再次运行,add。否决票(不是我的)可能是因为POSIX允许在信号处理程序中调用相当多的函数:(尽管
printf()
不是其中之一)。
Wait
Wait
Wait
Wait
Wait
Wait
Wait
Wait
Wait
Wait
Hi I'm at handler
Segmentation fault (core dumped)