2010-09-23 4 views
9

Ich habe dieses C-Code:Wie kann ich den Rückgabewert eines von exec ausgeführten Programms erhalten?

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

es execl ruft fsck zur Überprüfung des Dateisystems /dev/c0d0p1s0 laufen.

Meine Frage ist: Wie kann ich den Rückgabewert fsck bekommen?

Ich brauche den Rückgabewert von fsck, um zu überprüfen, ob das Dateisystem konsistent ist oder nicht.

Vielen Dank.

Antwort

12

Haben die Eltern-Prozess warten, für das Kind zu verlassen:

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

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

+0

@Roger danke. Ich werde es ausprobieren und Sie wissen lassen, was das Ergebnis ist. – mnish

+1

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. –

6

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.