Comment puis-je obtenir la valeur de retour d’un programme exécuté par exec?

J’ai ce code c:

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

il appelle execl pour exécuter fsck afin de 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.

Je vous remercie.

Demandez au processus parent d’attendre la sortie de l’enfant:

 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 } } 

Vous devez appeler wait() ou waitpid() dans le processus parent et cela vous donnera le statut de sortie du programme exécuté par execl() . Ne pas appeler l’un d’eux fera en sorte que le processus enfant rest un zombie lorsqu’il se termine, c’est-à-dire qu’un processus est mort mais rest dans la table des processus car son parent n’était pas intéressé par son code retour.

 #include  #include  #include  ... 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() dans l’enfant est destiné à l’empêcher de poursuivre l’exécution en cas d’ execl() . Son état de retour (127) est également nécessaire pour distinguer le cas d’une execl() éventuelle de execl() dans le parent.