我不知道为什么这个程序在报警处理程序完成其工作时崩溃,因为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编译
答案 0 :(得分:1)
在信号处理程序中几乎没有任何事情可做,几乎所有事情都会导致未定义的行为。
C标准唯一保证的是设置volatile sig_atomic_t
POSIX标准允许很多其他功能,但不允许printf
。
特别是,printf()
调用可能会中断对同一输出流和其他内存分配请求的其他访问,从而造成无限制的破坏。
正如“nos”评论的那样,使用一个大部分未初始化的结构来调用sigaction
也不是最明智的决定。