2011-09-25 13 views
7

Ho creato un programma utilizzando fork() e exec*(). Il problema è che non riesco a determinare l'esito positivo o negativo di exec() dal processo padre perché si trova su un processo secondario separato. Penso che il tipo di segnalazione possa essere usato per verificare questo stato, ma non ne ho idea.Approccio standard per determinare il successo o il fallimento di fork/exec (mentre il genitore è in esecuzione contemporaneamente)?

  1. Qual è il modo consigliato/standard/ampiamente utilizzato per verificare questo?
  2. E quali sono le insidie ​​di cui mi devo preoccupare mentre lo faccio?

Domanda Particolare Aggiornamento (Ci scusiamo per omissione di dettaglio importante)

voglio mantenere entrambi i processi sono in esecuzione, quindi non posso solo aspettare l'uscita del processo figlio. In altre parole, desidero ricevere una notifica sul processo figlio "exec esito positivo o negativo.

+0

Si sa che è possibile interrogare lo stato secondario senza bloccare usando 'waitpid' e l'opzione' WNOHANG'? A seconda del tuo sistema potresti anche avere 'wait3' e' wait4' che capiscono anche questo flag. O vuoi segnalare qualcosa al genitore mantenendo il bambino in esecuzione (come con i semafori IPC)? – DarkDust

+0

@DarkDust Voglio mantenere entrambi i processi in esecuzione e desidero ricevere la notifica dello stato 'exec' del processo figlio. (successo o fallimento) Oh hai chiarito la mia domanda. Grazie :) – Eonil

+1

possibile duplicato di [Che cosa può causare il fallimento di exec? Cosa succede dopo?] (Http://stackoverflow.com/questions/3703013/what-can-cause-exec-to-fail-what-happens-next) (In particolare, vedi [la risposta da "R."] (http://stackoverflow.com/questions/3703013/#3703179)) – Nemo

risposta

7

Il processo padre può utilizzare il pid del processo figlio per rilevare che è vivo o che è uscito (e può disambiguare il codice di errore ed errori dovuti a causa del segnale, vedere waitpid). È possibile utilizzare determinati codici di errore o segnali per notificare al genitore casi specifici di errore (ad esempio, nel bambino biforcuto prima dell'esecuzione), ma per un figlio completamente generico, potrebbe non essere possibile riservare alcun codice di uscita o segnale (dal momento che il il genitore non sarà in grado di dire se l'exec ha avuto successo e quindi il bambino è uscito con quei valori).

Un altro approccio spesso utilizzato è quello di creare una pipe fd pair (vedere il "pipe" syscall) e passare un'estremità al figlio (generalmente la fine della scrittura) e l'altra al genitore. Il bambino può usare questo per inviare codici di errore specifici al genitore. E il genitore può rilevare la terminazione prematura se la pipa viene chiusa senza ottenere alcun dato. Ci sono alcune insidie: SIGPIPE verrà inviato al genitore se viene letto su una pipe senza scrittori attivi e l'uso di un file fd (diverso da stdin/stdout/stderr) in un processo figlio può confondere alcuni processi figlio scritti male (anche se close-on-exec può aiutarti a risolverlo).

In generale, tutto il codice che ho visto per rendere fork + exec robusto è piuttosto hacky.

Problemi correlati