Почему printf никогда не выполняется после тревоги? - PullRequest
4 голосов
/ 06 июля 2019

Я пытаюсь сделать что-то простое с аварийными сигналами, однако printf никогда не выполняется после того, как я включил сигнализацию, почему это так?

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

Я хочу, чтобы hello и hello2 были напечатаны, только hello isсейчас печатается

1 Ответ

6 голосов
/ 06 июля 2019

Вы не указали обработчик для 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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...