/* * Pai recebe um sinal quando um filho morre. */ #include #include #include #include #include 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() { sigset_t mascara, mascara_anterior; int i; n_filhos = 0; signal(SIGCHLD, trata_SIGCHLD); sigfillset(&mascara); sigdelset(&mascara, SIGTERM); sigdelset(&mascara, SIGINT); sigprocmask (SIG_SETMASK, &mascara, &mascara_anterior); /* Cria filhos sem saber da morte de nenhum... */ for (i = 0; i < 5; i++) { if (fork() == 0) return 0; } sigprocmask (SIG_SETMASK, &mascara_anterior, NULL); sleep(2); /* Aguarda um pouco para os filhos morrerem */ if (n_filhos) printf("Eu perdi %d filho(s).\n", n_filhos); return 0; }