2010-04-19 8 views

risposta

11

Ecco un esempio che ho scritto molto tempo fa. Fondamentalmente, dopo aver biforcato un processo figlio e hai wait stato di uscita, puoi controllare lo stato usando due Macro. WIFEXITED viene utilizzata per verificare se il processo è terminato normalmente, e WEXITSTATUS controlli ciò che il numero restituito è nel caso in cui esso restituito normalmente:

#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

ma in questo esempio otterrò exit (numero); valore restituito in WEXITSTATUS (statval).Come posso rilevare il valore restituito del comando ping? – skujins

+1

Invece di exit (numero) scrivi il tuo exec. –

+0

ma execl() pretende molto restituire qualsiasi valore, execpt se non riesce, quindi, restituisce comando ping 0 o 1 – skujins

4

funzione exec familly non restituisce, il ritorno int è qui solo quando si verifica un errore al momento dell'avvio (come non trovare il file da eseguire).

devi prendere valore di ritorno dal segnale inviato al processo che l'prima di chiamare exec .

chiamata wait() owaitpid() nel vostro gestore di segnale (bene, si può anche chiamare wait() nel vostro processo senza l'utilizzo di alcun gestore di segnale, se non ha niente altro da fare).

0

È possibile attendere il processo secondario e ottenere lo stato di uscita. La chiamata di sistema è attesa (pid), prova a leggerla.

5

È possibile utilizzare waitpid per ottenere lo stato di uscita di voi processo figlio come:

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

Solo per evitare fraintendimenti: lo "stato di uscita" come retouend di 'waitpid()' non è il "codice di uscita" restituito dal programma figlio. Vedi la risposta di * AraK * http://stackoverflow.com/a/2667166/694576 per i dettagli. – alk

3

Ha avuto difficoltà a capire e applicare le risposte esistenti.

In AraK's answer, se l'applicazione ha più di un processo figlio in esecuzione, non è possibile sapere quale specifico processo figlio ha prodotto lo stato di uscita ottenuto. Secondo la pagina man,

wait() e waitpid()

Il wait() chiamata di sistema sospende l'esecuzione del processo chiamante fino uno dei suoi figli termina. La chiamata di attesa (& stato) è equivalente a:

 waitpid(-1, &status, 0); 

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

Quindi, per ottenere lo stato di uscita di un processo figlio specifica dovremmo riscrivere la risposta come:

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

Sentitevi liberi di trasforma questa risposta in una modifica della risposta di AraK.

Problemi correlati