/* * O sinal fica bloqueado para todas as threads? * Como desbloquear para uma delas? */ #include #include #include #include #include #define N_THR 10 void trata_SIGTERM(int signum) { printf("Adeus mundo cruel!\n"); signal(SIGTERM, SIG_DFL); raise(SIGTERM); } void* f_thread(void *v) { int thr_id = *(int *) v; if (thr_id == 9) { sigset_t unblock_sigterm; sigemptyset (&unblock_sigterm); sigaddset (&unblock_sigterm, SIGTERM); pthread_sigmask (SIG_UNBLOCK, &unblock_sigterm, NULL); } sleep(3); printf("Thread %d.\n", thr_id); return NULL; } int main() { sigset_t block_sigterm; pthread_t thr[N_THR]; int i, id[N_THR]; sigemptyset (&block_sigterm); sigaddset (&block_sigterm, SIGTERM); sigprocmask (SIG_BLOCK, &block_sigterm, NULL); signal(SIGTERM, trata_SIGTERM); if (fork() == 0) { sleep(1); kill(getppid(),SIGTERM); } else { for (i = 0; i < N_THR; i++) { id[i] = i; pthread_create(&thr[i], NULL, f_thread, (void*) &id[i]); } for (i = 0; i < N_THR; i++) pthread_join(thr[i], NULL); } return 0; }