为什么在报警后,printf从不执行?

时间:2019-07-06 02:24:17

标签: c linux

我正在尝试对警报进行一些简单的操作,但是在发出警报后,printf始终无法执行,为什么?

#include <stdio.h>
#include <signal.h> 
    int main() { 
    alarm(3); 
    printf("Hello...\n"); 
    alarm(6); 
    while(1); 
    printf("Hello2\n"); 
} 

我希望打印hello和hello2,目前仅打印hello

1 个答案:

答案 0 :(得分:6)

您没有为SIGALRM指定处理程序,它的默认行为(根据man 7 signal)是终止程序。即使您确实指定了处理程序,运行该程序后,您仍将处于while(1)循环中。

这是修改程序以解决这两个问题的方式:

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

volatile sig_atomic_t got_sigalrm = 0;

void handle_sigalrm(int signum) {
    got_sigalrm = 1;
}

int main() {
    struct sigaction act = { .sa_handler = handle_sigalrm };
    sigaction(SIGALRM, &act, NULL);
    alarm(3);
    printf("Hello...\n");
    alarm(6);
    while(!got_sigalrm);
    printf("Hello2\n");
}