Ven 19 Luglio, 03:39:32 - 2019

Autore Topic: P9-E1  (Letto 243 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline 6ninjak

  • Studente
  • *
  • Post: 12
  • FeedBack: +5/-0
    • Mostra profilo
P9-E1
« il: Dom 19 Maggio, 16:20:41 - 2019 »
Codice: [Seleziona]
void check_perror(int res, const char* msg) {
    if (res == -1) {
        perror(msg);
        exit(EXIT_FAILURE);
    }
    return;
}

void handler(int signum) {
    int status;
    int pid = wait(&status);
    check_perror(pid, "Errore nella wait");
    printf("* terminato figlio %d\n", pid);
    return;
}

void do_work(int n){
    struct sigaction act = { 0 };
    act.sa_handler = handler;
    int ret = sigaction(SIGCHLD, &act, NULL);
    check_perror(ret, "Errore nella sigaction");
    pid_t pid;
    int i;
    for (i = 1; i < n; i++) {
        pid = fork();
        check_perror(pid, "Errore nella fork");
        if (pid == 0) {
            printf("- creato figlio %d\n", getpid());
            sleep(i);
            _exit(EXIT_SUCCESS);
        }
    }
    while (n > 1) {
        pause();
        n--;
    }
    kill(getpid(), SIGTERM);
}

EDIT: ho sperimentato con la sleep... non capisco perché il codice funzioni solo con una sleep(i) (che ho sbirciato dalla soluzione ::))
« Ultima modifica: Dom 19 Maggio, 21:11:13 - 2019 da 6ninjak »

Offline lupin

  • Prof
  • Direttore di Dipartimento
  • ******
  • Post: 2804
  • FeedBack: +340/-14
    • Mostra profilo
Re:P9-E1
« Risposta #1 il: Sab 01 Giugno, 15:17:37 - 2019 »
Dunque ci sei quasi, ma leggi bene il testo: "Il gestore del segnale (che gira nel processo genitore) fa una wait; quando l’ultimo processo termina, il gestore del segnale manda in segnale SIGTERM a se stesso per terminare anche il genitore". E' il gestore del segnale che deve inviare SIGKILL al processo stesso, non do_work.

La sleep(i) fa parte delle specifiche: "il figlio i-esimo dorme i secondi"
Camil Demetrescu

"If you think education is expensive, try ignorance" (Robert Orben)