#include #include #include #include #include #include #include #include static void on_sigint(int signo) { char buf[1024]; snprintf(buf, sizeof(buf), "signal %d\n", signo); (void)write(STDOUT_FILENO, buf, strlen(buf)); } static void * thr(void *cookie) { sigset_t sigs; if (sigemptyset(&sigs) == -1) err(EXIT_FAILURE, "sigemptyset"); if (sigaddset(&sigs, SIGINT) == -1) err(EXIT_FAILURE, "sigaddset(SIGINT)"); if (pthread_sigmask(SIG_BLOCK, &sigs, NULL) == -1) err(EXIT_FAILURE, "pthread_sigmask"); sleep(10); return NULL; } int main(void) { struct sigaction sa; pthread_t t; int error; memset(&sa, 0, sizeof(sa)); sa.sa_handler = &on_sigint; if (sigfillset(&sa.sa_mask) == -1) err(EXIT_FAILURE, "sigfillset"); if (sigaction(SIGINT, &sa, NULL) == -1) err(EXIT_FAILURE, "sigaction(SIGINT)"); error = pthread_create(&t, NULL, &thr, NULL); if (error) { errno = error; err(EXIT_FAILURE, "pthread_create"); } printf("join\n"); fflush(stdout); error = pthread_join(t, NULL); if (error) { errno = error; err(EXIT_FAILURE, "pthread_join"); } fflush(stdout); return ferror(stdout); }