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.
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
@Roger merci. Je vais essayer et vous laisser savoir quel était le résultat. – mnish
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()'. –