Γ Πρόγραμμα μπλοκ σημάτων αλλά μόνο παραδίδει ένα

ψήφοι
0

Δεν είμαι πολύ εξοικειωμένος με τις λειτουργίες του σήματος και προσπαθώ να βγάλουν νόημα από όλα. Ο παρακάτω κώδικας υποτίθεται να μπλοκάρει όλες SIGINTs για τα πρώτα 10 δευτερόλεπτα, και στη συνέχεια χειρίζεται όλα τα σήματα μετά γίνεται απεμπλοκή (10 δευτ. Σημείο). Το πρόβλημα που αντιμετωπίζω είναι ότι μόνο ένα σήμα που παραδίδεται ανεξάρτητα από το πόσες φορές έχω καλέσει ctrl + c. Τι θα μπορούσε να μπορώ να κάνει λάθος;

#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;
}
Δημοσιεύθηκε 09/10/2019 στις 18:55
πηγή χρήστη
Σε άλλες γλώσσες...                            

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