/* * Pai recebe um sinal quando um filho morre. */ #include #include #include #include #include typedef void (*sighandler_t)(int); int n_filhos; void trata_SIGCHLD(int signum) { int pid; while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) { printf("Meu filho %d morreu.\n", pid); n_filhos++; } } int main() { int i; n_filhos = 0; signal(SIGCHLD, trata_SIGCHLD); for (i = 0; i < 10; i++) /* Pai cria 5 filhos */ if (fork() == 0) { sleep(1); printf("Sou filho %d.\n", getpid()); return 0; /* Filhos não fazem nada */ } while(n_filhos < 10) sleep(1); /* Aguarda um pouco para os filhos morrerem */ if (n_filhos) printf("Eu perdi %d filhos.\n", n_filhos); return 0; }