#include #include #include #include #include static volatile int stop; static pthread_t td1; static int count1; void *test(void *a) { sigset_t set; sigemptyset(&set); pthread_sigmask(SIG_SETMASK, &set, NULL); int *p = (int *)a; while (!stop) { ++*p; getpid(); } return 0; } void alarm_handler(int sig) { sigset_t set; pthread_sigmask(SIG_SETMASK, NULL, &set); if (pthread_self() == td1) printf("Caught signal in td1\n"); else printf("Caught signal in main\n"); printf("Signal mask is 0x%x\n", set.__bits[0]); stop = 1; } int main() { int err; struct sigaction sa; void *rc; sa.sa_flags = 0; sigfillset(&sa.sa_mask); sa.sa_handler = alarm_handler; pthread_sigmask(SIG_SETMASK, &sa.sa_mask, NULL); sigaction(SIGALRM, &sa, NULL); alarm(5); printf("Main thread mask is 0x%x\n", sa.sa_mask.__bits[0]); err = pthread_create(&td1, NULL, test, &count1); if (err) errx(1, "pthread_create returns error\n"); pthread_sigmask(SIG_SETMASK, NULL, &sa.sa_mask); pthread_join(td1, &rc); printf("%d\n", count1/5); return 0; }