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).