Ho una funzione che si biforca un processo, descrittori di file duplicati per buffer di ingresso e di uscita, e poi corre execl
su un comando trasmesso in via di una stringa denominata cmd
:Catturare codice di stato di uscita del processo figlio
static pid_t
c2b_popen4(const char* cmd, int pin[2], int pout[2], int perr[2], int flags)
{
pid_t ret = fork();
if (ret < 0) {
fprintf(stderr, "fork() failed!\n");
return ret;
}
else if (ret == 0) {
/*
Assign file descriptors to child pipes (not shown)...
*/
execl("/bin/sh", "/bin/sh", "-c", cmd, NULL);
fprintf(stderr, "execl() failed!\n");
exit(EXIT_FAILURE);
}
else {
/*
Close parent read and write pipes (not shown)...
*/
return ret;
}
return ret;
}
Ciascuna delle istanze cmd
elabora correttamente i miei dati, a condizione che i miei input di test siano corretti.
Quando cattivo dati vengono passati ad un processo figlio, il mio programma genitore verrà eseguito fino al completamento e uscire con un codice di stato non-errore 0.
Se ho volutamente messo in cattive di ingresso - per cercare di proposito per ottenere una delle istanze cmd
fallire in modo atteso - Mi piacerebbe sapere come acquisire lo stato di uscita di quello cmd
in modo che possa emettere il codice di stato di errore corretto dal programma principale, prima della conclusione.
Come si fa generalmente?
Quando eseguo il primo blocco di codice (l'esempio "ad esempio"), il processo si blocca sulla chiamata 'waitpid()'. –
@AlexReynolds: Ecco come funziona per impostazione predefinita, vedere l'aggiornamento per rispondere. Avrai bisogno di un qualche tipo di strategia per rilevare e quindi affrontare la possibilità che i processi figli finiscano presto. –