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?

È stato utile?

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 di execvp() e utilizzare tale valore nel exit() come lei ha suggerito. Il tuo codice bambino dovrebbe mai restituire 0, dal momento che l'unico successo significa che il execvp 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 parametro status restituito. Notevole per il vostro scopo sono WIFEXITED di dirvi se il bambino è uscito "normalmente", e WEXITSTATUS ottenere lo stato del bambino come passato a exit(). Vedere la pagina man waitpid 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top