15 votes

Comment obtenir la valeur de retour d'un programme exécuté en appelant un membre de la famille des fonctions exec ?

Je sais qu'il est possible de lire la sortie des commandes avec un pipe ? Mais qu'en est-il de la récupération de la valeur de retour ? Par exemple, je veux exécuter :

execl("/bin/ping", "/bin/ping" , "-c", "1", "-t", "1", ip_addr, NULL);

Comment puis-je obtenir la valeur retournée par la commande ping pour savoir si elle a retourné 0 ou 1 ?

17voto

AraK Points 38702

Voici un exemple que j'ai écrit il y a longtemps. En gros, après avoir forké un processus enfant et avoir wait son statut de sortie, vous vérifiez le statut à l'aide de deux macros. WIFEXITED est utilisé pour vérifier si le processus a quitté normalement, et WEXITSTATUS vérifie quel est le numéro de retour au cas où il serait retourné normalement :

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
    int number, statval;
    printf("%d: I'm the parent !\n", getpid());
    if(fork() == 0)
    {
        number = 10;
        printf("PID %d: exiting with number %d\n", getpid(), number);
        exit(number) ;
    }
    else
    {
        printf("PID %d: waiting for child\n", getpid());
        wait(&statval);
        if(WIFEXITED(statval))
            printf("Child's exit code %d\n", WEXITSTATUS(statval));
        else
            printf("Child did not terminate with exit\n");
    }
    return 0;
}

5voto

codaddict Points 154968

Vous pouvez utiliser waitpid pour obtenir le statut de sortie de votre processus enfant en tant que :

int childExitStatus;
waitpid( pID, &childExitStatus, 0); // where pID is the process ID of the child.

4voto

kriss Points 10450

La fonction exec ne retourne pas, l'int de retour est ici seulement quand une erreur se produit au moment du lancement (comme ne pas trouver le fichier à exécuter).

Vous devez récupérer la valeur de retour du signal envoyé au processus qui a bifurqué avant d'appeler exec .

appelez attendre() o waitpid() dans votre gestionnaire de signaux (vous pouvez également appeler wait() dans votre processus sans utiliser de gestionnaire de signaux s'il n'a rien d'autre à faire).

3voto

xor007 Points 33

J'ai eu du mal à comprendre et à appliquer les réponses existantes.

En Réponse d'AraK Si l'application a plus d'un processus enfant en cours d'exécution, il n'est pas possible de savoir quel processus enfant spécifique a produit l'état de sortie obtenu. Selon la page de manuel,

wait() et waitpid()

Le site attendre() L'appel système suspend l'exécution du processus appelant jusqu'à ce que l'un de ses enfants se termine . L'appel wait(&status) est équivalent à :

       waitpid(-1, &status, 0);

   The **waitpid()** system call suspends execution of the calling process until a **child specified by pid** argument has changed state.

Ainsi, pour obtenir le statut de sortie d'un processus enfant spécifique, nous devons réécrire la réponse comme suit :

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
    int number, statval;
    int child_pid;
    printf("%d: I'm the parent !\n", getpid());
    child_pid = fork();
    if(child_pid == -1)
    { 
        printf("could not fork! \n");
        exit( 1 );
    }
    else if(child_pid == 0)
    {
        execl("/bin/ping", "/bin/ping" , "-c", "1", "-t", "1", ip_addr, NULL);
    }
    else
    {
        printf("PID %d: waiting for child\n", getpid());
        waitpid( child_pid, &statval, WUNTRACED
                    #ifdef WCONTINUED       /* Not all implementations support this */
                            | WCONTINUED
                    #endif
                    );
        if(WIFEXITED(statval))
            printf("Child's exit code %d\n", WEXITSTATUS(statval));
        else
            printf("Child did not terminate with exit\n");
    }
    return 0;
}

N'hésitez pas à transformer cette réponse en une modification de la réponse d'AraK.

1voto

duduamar Points 1364

Vous pouvez attendre sur le processus enfant et obtenir son statut de sortie. L'appel système est wait(pid), essayez de le lire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X