Come uscire da un processo figlio e restituisce il suo stato da execvp ()?
Domanda
Nel mio semplice shell personalizzata che sto leggendo i comandi dallo standard input ed eseguirli con execvp (). Prima di questo, creo un fork del processo in corso e io chiamo l'execvp () in quel processo figlio, subito dopo, chiamo exit (0).
Qualcosa di simile a questo:
pid = fork();
if(pid == -1) {
perror("fork");
exit(1);
}
if(pid == 0) {
// CHILD PROCESS CODE GOES HERE...
execvp(pArgs[0], pArgs);
exit(0);
} else {
// PARENT PROCESS CODE GOES HERE...
}
Ora, i comandi vengono eseguiti con execvp () può restituire errori di destra? Voglio gestire tale correttamente e in questo momento, io sono sempre chiamando exit (0), il che significa che il processo figlio avrà sempre uno stato "OK".
Come posso restituire lo stato corretto dal execvp () chiamare e metterlo in uscita () chiamare? Devo solo ottenere il valore int che execvp () restituisce e passarlo come uscita () argomento, invece di 0. È sufficiente e corretta?
Soluzione
È necessario utilizzare waitpid(3)
o wait(1)
nel codice genitore di attendere che il bambino per uscire e ottenere il messaggio di errore.
La sintassi è:
pid_t waitpid(pid_t pid, int *status, int options);
o
pid_t wait(int *status);
status
contiene lo stato di uscita. Guardate il pagine man per vedere come analizzarlo.
Si noti che non è possibile farlo dal processo figlio. Una volta che si chiama execvp
il processo figlio muore (a tutti gli effetti) ed è sostituito dal processo exec
'd. L'unico modo è possibile raggiungere exit(0)
c'è se execvp
si fallisce, ma poi il fallimento non è perché il nuovo programma si è concluso. E 'perché non è mai ha funzionato per cominciare.
Modifica il processo figlio non davvero morire. Il PID e l'ambiente rimangono invariati, ma l'intero codice ei dati vengono sostituiti con il processo exec
'd. Potete contare su non ritorno al processo figlio originale, a meno che non riesce exec
.
Altri suggerimenti
Dalla tua domanda è un po 'difficile capire quello che stai chiedendo. Quindi cercherò di coprire un paio di questioni relative:
-
execvp()
o non ritorno (in caso di successo), o restituisce un errore. Significato il codice bambino solo bisogno di gestire le condizioni di errore. Il tuo codice bambino dovrebbe catturare il risultato diexecvp()
e utilizzare tale valore nelexit()
come lei ha suggerito. Il tuo codice bambino dovrebbe mai restituire 0, dal momento che l'unico successo significa che ilexecvp
ha funzionato e che processs restituirà 0 (o non). - Il genitore può ottenere informazioni bambino da
waitpid()
su di esso è stato di uscita. Ci sono diverse macro definite per tirare informazioni dal parametrostatus
restituito. Notevole per il vostro scopo sonoWIFEXITED
di dirvi se il bambino è uscito "normalmente", eWEXITSTATUS
ottenere lo stato del bambino come passato aexit()
. Vedere la pagina manwaitpid
per le altre macro.
Usa wait()
o waitpid()
nel processo padre. Un esempio qui: codice di ritorno quando OS uccide il processo .
Inoltre, quando un bambino muore il segnale SIGCHLD
viene inviato al processo padre.