报警处理程序完成时的malloc分段错误
我不知道为什么这个程序在报警处理程序完成其工作时崩溃,这是由于malloc语句(第1行),尽管它从未被调用过 当我注释第1行或第2行时,代码继续运行,没有任何问题,但是注释第3行时,程序仍然崩溃报警处理程序完成时的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
#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)