Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [c] Valore di ritorno di un processo figlio!!

    Ciao!!!

    Ho dei problemi con la funzione wait, perché nella variabile stutus trovo un valore casuale e non l'effettivo valore di ritorno del processo!!!

    Forse ho capito male il significato di questo parametro!!!

    Posto un po di codice per migliorare la compressione del problema...


    Programma principale :
    codice:
     
    #include <stdio.h>
    #include <unistd.h>
    #include <errno.h>
    #include <sys/wait.h>
    
    
    #define prg "/home/giuseppe/prova"
    
    int main () {
            pid_t pid;
            int cod_rit_figlio;
    
            pid = fork();
    
            if (!pid) {
                    // processo figlio
                    execve(prg, NULL, NULL);
            }       else {
                    wait(&cod_rit_figlio);
                    printf("Il processo figlio ha restituito : %d\n", cod_rit_figlio);
            }
            return 0;
    }
    Banale programma prova :

    codice:
    #include <stdio.h>
    
    int main () {
    
            printf("Processo figlio\n");
            sleep(10);
            return 7;  // ho provato anche con exit(7) ma non cambia niente
    }
    Se questo viene eseguito il valore che mi viene stampato è casuale e non sette!!!

    HELP....

  2. #2
    wait non ti dà il codice restituito dal processo figlio, come spiegato nella sua man page.
    codice:
    #include <stdio.h>
    #include <unistd.h>
    #include <errno.h>
    #include <sys/wait.h>
    
    #define prg "/home/giuseppe/prova"
    
    int main()
    {
        pid_t pid;
        int cod_stato_figlio;
    
        pid = fork();
    
        if (!pid)
        {
            // processo figlio
            execve(prg, NULL, NULL);
        }
        else
        {
            wait(&cod_stato_figlio);
            if (WIFEXITED(cod_stato_figlio))
                printf
                ("Il processo figlio è terminato autonomamente; ha restituito %d\n",
                 WEXITSTATUS(cod_rit_figlio));
            else if (WIFSIGNALED(cod_stato_figlio))
                printf
                ("Il processo figlio è stato terminato dal segnale %d.\n",
                 WTERMSIG(cod_rit_figlio));
            else if (WIFSTOPPED(cod_stato_figlio))
                printf
                ("Il processo figlio è stato interrotto dal segnale %d.\n",
                 WSTOPSIG(cod_rit_figlio));
        }
        return 0;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

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.