Sie wait()
oder waitpid()
in den übergeordneten Prozess aufrufen müssen und es wird Sie den Exit-Status des von execl()
ausgeführten Programms geben. Wenn keiner von diesen aufgerufen wird, wird der Kindprozess ein Zombie bleiben, wenn er beendet wird, d. H. Ein Prozess, der tot ist, aber in der Prozesstabelle verbleibt, weil sein Elternteil nicht an seinem Rückkehrcode interessiert war.
#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() */
}
Der _exit()
Anruf in dem Kind ist es aus forter Ausführung zu verhindern, falls execl()
ausfällt. Sein Rückgabestatus (127) ist auch notwendig, um den Fall eines eventuellen execl()
Fehlers im Elternteil zu unterscheiden.
Yup, rate ich falsch gelesen! Ich versuchte darauf hinzuweisen; Rückkehrcode würde in "errno" gesetzt werden. Na klar natürlich, dass der Rückgabecode Elternteil auf das Kind warten muss :) ... Anyways löschte die Antwort. – KedarX
@Roger danke. Ich werde es ausprobieren und Sie wissen lassen, was das Ergebnis ist. – mnish
Es muss angemerkt werden, dass im speziellen Fall des Aufrufs von 'execl()' im Kind auch danach '_exit()' aufgerufen werden sollte, um zu verhindern, dass das Kind die Ausführung fortsetzt, falls 'execl()' fehlschlägt. Sie sollten auch einen neuen Fall im Elternteil haben, der einen eventuellen 'execl()' Fehler behandelt. –