interpreter : handle_sigchld.c - owanesh/unifi-eos GitHub Wiki
void handle_sigchld() {
pid_t pid;
int saved_errno = errno;
//ripeto il ciclo finchè ci sono processi che hanno terminato
while ((pid = waitpid((pid_t) (-1), NULL, WNOHANG)) > 0) {
printf("Il processo id:%d è terminato con successo.\n", pid);
//(pid_t) (-1): attendi qualunque figlio
//&status==NULL: non ci interessa lo stato di terminazione
//WNOHANG: esci se il segnale non era un figlio che ha terminato (restituisce 0)
}
errno = saved_errno; //ripristino errno
}
Nella condizione del ciclo while si salva il pid di qualunque figlio abbia terminato (più di uno se terminati contemporaneamente): per ogni pid (sicuramente maggiore di 0) si stampa un messaggio di terminazione opportuno.
Dato che waitpid() sarebbe bloccante fino a che un figlio termini, se venisse richiamata per qualche motivo il processo padre si fermerebbe: per evitare ciò è stato imposto il flag WNOHANG (in caso restituisce 0).