2010-09-23 16 views
9

Je possède ce code c:Comment puis-je obtenir la valeur de retour d'un programme exécuté par exec?

if(fork()==0){ 
    execl("/usr/bin/fsck", "fsck", "/dev/c0d0p1s0", NULL); 
} 

il appelle execl à exécuter fsck pour vérifier le système de fichiers /dev/c0d0p1s0.

Ma question est: comment puis-je obtenir la valeur de retour de fsck?

J'ai besoin de la valeur de retour de fsck pour vérifier si le système de fichiers est cohérent ou non.

Merci.

Répondre

12

Demandez au processus parent attente pour l'enfant pour quitter:

pid_t pid = fork(); 
if (pid == -1) { 
    // error, no child created 
} 
else if (pid == 0) { 
    // child 
} 
else { 
    // parent 
    int status; 
    if (waitpid(pid, &status, 0) == -1) { 
    // handle error 
    } 
    else { 
    // child exit code in status 
    // use WIFEXITED, WEXITSTATUS, etc. on status 
    } 
} 
+0

Ouais, je suppose que je l'ai mal lu! J'essayais de le signaler; le code de retour serait défini dans "errno". Bien sûr, bien sûr, pour lire ce code de retour parent doit attendre l'enfant :) ... De toute façon supprimé la réponse. – KedarX

+0

@Roger merci. Je vais essayer et vous laisser savoir quel était le résultat. – mnish

+1

Il faut noter que dans le cas particulier d'appeler 'execl()' dans l'enfant, vous devriez également appeler '_exit()' juste après cela pour empêcher l'exécution continue de l'enfant au cas où 'execl()' échouerait. Vous devriez également avoir un nouveau cas dans le parent qui gère un éventuel échec de 'execl()'. –

6

Vous devez appeler wait() ou waitpid() dans le processus parent et il vous donnera l'état de sortie du programme exécuté par execl(). Ne pas appeler l'un de ceux-ci fera que le processus enfant reste un zombie lorsqu'il se termine, c'est-à-dire un processus qui est mort mais reste dans la table de processus parce que son parent n'était pas intéressé par son code de retour.

#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 

... 

pid_t pid; 
int status; 

if ((pid = fork()) == 0) { 
    /* the child process */ 
    execl(..., NULL); 
    /* if execl() was successful, this won't be reached */ 
    _exit(127); 
} 

if (pid > 0) { 
    /* the parent process calls waitpid() on the child */ 
    if (waitpid(pid, &status, 0) > 0) { 
    if (WIFEXITED(status) && !WEXITSTATUS(status)) { 
     /* the program terminated normally and executed successfully */ 
    } else if (WIFEXITED(status) && WEXITSTATUS(status)) { 
     if (WEXITSTATUS(status) == 127) { 
     /* execl() failed */ 
     } else { 
     /* the program terminated normally, but returned a non-zero status */ 
     switch (WEXITSTATUS(status)) { 
      /* handle each particular return code that the program can return */ 
     } 
     } 
    } else { 
     /* the program didn't terminate normally */ 
    } 
    } else { 
    /* waitpid() failed */ 
    } 
} else { 
    /* failed to fork() */ 
} 

L'appel _exit() chez l'enfant est de l'empêcher de poursuivre l'exécution en cas execl() échoue. Son statut de retour (127) est également nécessaire pour distinguer le cas d'un éventuel échec execl() dans le parent.