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.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 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.
Usi il valore restituito da waitpid.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?
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 }

Rispondi quotando