/* * 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; do { pid = waitpid(-1, NULL, WNOHANG); if (pid > 0) { printf("Meu filho %d morreu.\n", pid); n_filhos++; } } while (pid > 0); } 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) { sleep(1); } else return 0; } sigprocmask (SIG_SETMASK, &mascara_anterior, NULL); if (n_filhos) printf("Eu perdi %d filhos.\n", n_filhos); return 0; }