Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408

    [C] Processi figli non terminano

    Salve a tutti! Devo scrivere un programma in C che crei 4 processi figli. Ogni processo figlio ha una variabile contatore "cnt" che viene incrementata ogni volta che il processo riceve il segnale SIGUSR1. Ogni processo figlio, ogni secondo, valuta l'espressione "cnt > 10" e, se il risultato è TRUE, termina.
    Il processo padre, una volta creati i figli, deve inviare ripetutamente il segnale SIGUSR1 ad un figlio scelto a caso (conservo i pid dei figli in un array e genero l'indice tra 0 e 3 randomicamente).Quando tutti i figli terminano l'esecuzione, termina anche il padre.

    Ho il seguente codice che mi è stato fornito dal prof, ma che non funziona. Quando i processi figli ricevono il segnale SIGUSR1 viene chiamata la funzione handler che aumenta il contatore. Quando il padre invia il segnale SIGCHLD, viene chiamata la funzione exit_handler. Il problema è che, in esecuzione, dopo aver creato i 4 processi, viene terminato un processo figlio, chiamata 4 volte la funzione handler e poi basta. Continua così senza terminare mai. Ho verificato che la kill viene chiamata e non capisco, quindi, perchè i processi non vengono terminati.
    Voglio precisare che mi sto approcciando da pochi giorni ai processi e a questo tipo di programmazione (per un esame universitario), quindi è possibile che abbia detto stupidaggini. Non siate troppo severi. Qualcuno sa dirmi dove ho sbagliato?

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #define NUM_PROC 4
    
    
    int cnt = 0;
    int term = 0;
    
    
    void handler(int signum){
        cnt++;
    }
    
    
    void exit_handler(int signum){
        int status;
        wait(&status);
        term++;
        printf("GENITORE: status del processo figlio = %d. Processi terminati: %d.\n", WEXITSTATUS(status), term);
    }
    
    
    int main(void)
    {
        pid_t pid[NUM_PROC];
        pid_t mypid;
        int i;
        
        for(i=0; i<NUM_PROC; i++){
            if((mypid = fork()) == 0){ // Figlio
                signal(SIGUSR1, handler);
                while(1){
                    sleep(1); // Ogni secondo..
                    if(cnt > 10){ // ..verifica l'espressione..
                        // ..se è vera stampa un messaggio di terminazione..
                        printf("FIGLIO (pid %d): %d, termino.\n", getpid(), i+1);
                        return(i+1);
                    }
                    printf("FIGLIO (pid %d): %d, termino.\n", getpid(), i+1);
                    return(i+1);
                }
            }else{ // Padre
                printf("GENITORE (pid %d): Ho generato il figlio con pid %d.\n", getpid(), mypid);
                pid[i] = mypid;
            }
        }
        
        signal(SIGCHLD, exit_handler);
        
        while(term < 4){
            int k = rand() % 4;
            usleep(50000);
            int check = kill(pid[k], SIGUSR1);
            if(check == 0){
                printf("Ucciso il processo figlio %d con successo.", pid[k]);
            }
        }
    }

  2. #2
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Risolto. Sto usando onlinegdb.com e mi è stato detto da un collega che su linux il programma gira correttamente. Evidentemente è un problema della piattaforma. Potete eliminare.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.