Originariamente inviato da wolf1792
allora, ancora non ho provato ma mi è saltato in mente qualche problema.
così facendo non ho lo stesso che avrei semplicemente non aspettando?cioè..metti che chiamo 'top &' e poi top; poi interrompo il processo di top &, il padre che aspettava top esce lo stesso dalla wait perchè gli arriva un segnale di uscita di un figlio.
Per i processi in primo piano, subito dopo la fork() usa la waitpid (senza WNOHANG) passando il pid del processo figlio, in modo da aspettare solo l'uscita del processo specifico che hai lanciato.
Per i processi in background, prima di mostrare di nuovo il prompt fai una waitpid "generica" (passando -1) con WNOHANG in loop, in modo da non bloccare se nessun processo in background è terminato, ma ottenere i codici di uscita (e rimuovere i processi "defunct") se ne sono terminati.
e la mia domanda era più a riguardo del caso in cui io chiami più processi in bg in fila.Come faccio a sapere di quale mi ha restituito 1?
Usi il valore restituito da waitpid.
Basta fare una cosa del genere:
codice:
pid_t p;
// Lancia il processo
p=fork();
if(p==0)
exec(...);
int status;
// Wait per il processo in foreground
if(processo foreground)
{
if(waitpid(p, &status, 0)==p)
{
int exitcode=WEXITSTATUS(status);
// eccetera
}
else
{
// errore nella waitpid
}
}
// Wait per i processi in background
while((p=waitpid(-1, &status, WNOHANG))>0)
{
int exitcode=WEXITSTATUS(status);
// il pid del processo terminato sta già in p
// eccetera
}