#include #include pthread_mutex_t mutex; void *thr_routine(void *arg) { printf("trying to lock mutex...\n"); if (pthread_mutex_lock(&mutex)) { printf("error lock mutex\n"); abort(); } printf("mutex locked\n"); if (pthread_mutex_unlock(&mutex)) printf("error unlock mutex\n"); return (0); } void handler(int sig, siginfo_t *info, void *ucp) { static int i = 1; printf("received signal(%d): %d\n", i++, sig); } int main() { struct sigaction sa; pthread_attr_t attr; pthread_t td; sigset_t mask; int i; pthread_mutex_init(&mutex, NULL); pthread_attr_init(&attr); //pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); pthread_mutex_lock(&mutex); sigemptyset(&sa.sa_mask); sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = handler; sigaction(SIGUSR1, &sa, NULL); pthread_create(&td, &attr, thr_routine, NULL); sigfillset(&mask); pthread_sigmask(SIG_SETMASK, &mask, NULL); for (i = 0; i < 3; ++i) { sleep(1); printf("send signal SIGUSR1\n"); kill(getpid(), SIGUSR1); } pthread_mutex_unlock(&mutex); pthread_join(td, NULL); return (0); }