2010-04-19 3 views
12

Ich weiß, dass es möglich ist, Befehlsausgabe mit einer Pipe zu lesen? Aber was ist mit Rückgabewert? Zum Beispiel möchte ich ausführen:Wie bekomme ich den Rückgabewert eines Programms, das über den Aufruf eines Mitglieds der exec-Familie von Funktionen ausgeführt wurde?

execl("/bin/ping", "/bin/ping" , "-c", "1", "-t", "1", ip_addr, NULL); 

Wie kann ich Wert von Ping-Befehl zurückgegeben bekommen, um herauszufinden, ob es 0 oder 1 zurück?

+0

Vielen Dank für Ihre nützlichen und schnellen Antworten. – skujins

Antwort

11

Hier ist ein Beispiel, das ich vor langer Zeit geschrieben. Grundsätzlich, nachdem Sie einen Child-Prozess forkiert haben und Sie wait seinen Exit-Status haben, überprüfen Sie den Status mit zwei Makros. WIFEXITED wird verwendet, um zu überprüfen, ob der Prozess normal beendet, und WEXITSTATUS prüft, was die zurückgegebene Zahl in Fall ist es wieder normal:

#include <stdio.h> 
#include <unistd.h> 
#include <sys/wait.h> 
int main() 
{ 
    int number, statval; 
    printf("%d: I'm the parent !\n", getpid()); 
    if(fork() == 0) 
    { 
     number = 10; 
     printf("PID %d: exiting with number %d\n", getpid(), number); 
     exit(number) ; 
    } 
    else 
    { 
     printf("PID %d: waiting for child\n", getpid()); 
     wait(&statval); 
     if(WIFEXITED(statval)) 
      printf("Child's exit code %d\n", WEXITSTATUS(statval)); 
     else 
      printf("Child did not terminate with exit\n"); 
    } 
    return 0; 
} 
+0

aber in diesem Beispiel werde ich exit (Nummer) bekommen; Wert, der in WEXITSTATUS (statval) zurückgegeben wird.Wie kann ich den zurückgegebenen Wert des Ping-Befehls erkennen? – skujins

+1

Anstelle von exit (Nummer) schreibe deine exec. –

+0

aber execl() gibt keinen Wert zurück, execpt wenn es fehlschlägt, deshalb gibt ping Befehl 0 oder 1 zurück – skujins

4

exec Funktion familly gibt nicht zurück, die Rückkehr int ist nur hier, wenn ein Fehler beim Start auftritt (wie nicht finden Datei zu exec).

Sie müssen den Rückgabewert des Signals abfragen, das an den Prozess gesendet wurde, der vor dem Aufruf ausgeteilt wurde exec.

Anruf wait() oder waitpid() im Signal-Handler (na ja, können Sie auch ohne Verwendung eines Signal-Handler wait() in Ihrem Prozess nennen, wenn es nichts anderes zu tun hat).

0

Sie können auf den Child-Prozess warten und dessen Exit-Status erhalten. Der Systemaufruf ist warten (pid), versuchen Sie, darüber zu lesen.

5

können Sie waitpid verwenden Sie den Exit-Status Sie Kind-Prozess zu erhalten, wie:

int childExitStatus; 
waitpid(pID, &childExitStatus, 0); // where pID is the process ID of the child. 
+0

Nur um Missverständnisse zu vermeiden: Der "exit status" als retuend von 'waitpid()' ist nicht der "exit code", der vom untergeordneten Programm zurückgegeben wird. Siehe * AraK * 's Antwort http://stackoverflow.com/a/2667166/694576 für Details. – alk

3

hatte Schwierigkeiten Verständnis und Anwendung der bestehenden Antworten.

In AraK's answer, wenn die Anwendung mehr als einen untergeordneten Prozess ausgeführt hat, ist es nicht möglich zu wissen, welcher bestimmte untergeordnete Prozess den erhaltenen Exit-Status erzeugte. Nach der Manpage

wait() und waitpid()

Die wait() Systemaufruf unterbricht die Ausführung des aufrufenden Prozesses bis eines seiner Kinder endet. Der Ruf wait (& Status) entspricht:

 waitpid(-1, &status, 0); 

    The **waitpid()** system call suspends execution of the calling process until a **child specified by pid** argument has changed state. 

Also, den Exit-Status eines bestimmten untergeordneten Prozess zu erhalten, sollten wir die Antwort umschreiben als:

#include <stdio.h> 
#include <unistd.h> 
#include <sys/wait.h> 
int main() 
{ 
    int number, statval; 
    int child_pid; 
    printf("%d: I'm the parent !\n", getpid()); 
    child_pid = fork(); 
    if(child_pid == -1) 
    { 
     printf("could not fork! \n"); 
     exit(1); 
    } 
    else if(child_pid == 0) 
    { 
     execl("/bin/ping", "/bin/ping" , "-c", "1", "-t", "1", ip_addr, NULL); 
    } 
    else 
    { 
     printf("PID %d: waiting for child\n", getpid()); 
     waitpid(child_pid, &statval, WUNTRACED 
        #ifdef WCONTINUED  /* Not all implementations support this */ 
          | WCONTINUED 
        #endif 
        ); 
     if(WIFEXITED(statval)) 
      printf("Child's exit code %d\n", WEXITSTATUS(statval)); 
     else 
      printf("Child did not terminate with exit\n"); 
    } 
    return 0; 
} 

Sek Verwandle diese Antwort in eine Bearbeitung von AraKs Antwort.

Verwandte Themen