C Programa bloquea las señales Pero sólo ofrece una

votos
0

No estoy muy familiarizado con las funciones de la señal y estoy tratando de dar sentido a todo. El código siguiente se supone que bloquear todos los SIGINTs para los primeros 10 segundos, y luego manejar todas las señales después de que se desbloquea (10 seg. Punto). El problema que estoy teniendo es que sólo una señal está siendo entregado independientemente de cuántas veces llamo ctrl + c. ¿Qué podría estar haciendo mal?

#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <time.h>
#include <signal.h>
#include <string.h>


void kill_handler(int signo)
{
    write(1, Hello\n, 6);
}

void alarm_handler(int signo)
{
    char str3[] = The 20 Seconds is over finished\n;
    write(1, str3, strlen(str3));
    exit(0);
}

int main(void) {
    //install alarm handler
    printf(The pid is: %i\n, getpid());
    sigset_t mask;
    sigset_t first_mask;
    struct sigaction saAlarm;
    struct sigaction newSa;
    struct sigaction saInt;
    memset(&newSa, 0, sizeof(newSa));
    memset(&saInt, 0, sizeof(saInt));
    memset(&saAlarm, 0, sizeof(saAlarm));
    // install alarm handler
    saAlarm.sa_flags = 0;
    saAlarm.sa_handler = alarm_handler;
    sigaction(SIGALRM, &saAlarm, NULL);
    // install ctrl c handler
    saInt.sa_flags = 0;
    saInt.sa_handler = kill_handler;
    sigaction(SIGINT, &saInt, NULL);
    //ignore sa
    newSa.sa_handler = SIG_IGN;
    newSa.sa_flags = 0;
    //enter block state
    sigemptyset(&mask);
    sigaddset(&mask, SIGINT);

    sigprocmask(SIG_BLOCK, &mask, &first_mask);
    alarm(20);
    sleep(10);
    //exit block state
    sigprocmask(SIG_SETMASK, &first_mask, NULL);
    //ignore sigint
    sigaction(SIGINT, &newSa, &saInt);
    //infinite loop
    while(1){}

    return 0;
}
Publicado el 09/10/2019 a las 18:55
fuente por usuario
En otros idiomas...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more