#include #include #include #include void *foo(void *bar) { fprintf(stderr,"thread %p\n",pthread_self()); sigset_t blocked; sigemptyset(&blocked); sigaddset(&blocked,SIGTERM); pthread_sigmask(SIG_BLOCK, &blocked,NULL); while(1) { pause(); fprintf(stderr,"thread %p awaken\n",pthread_self()); } } void handler(int foo) { fprintf(stderr,"foo %d %p\n",foo, pthread_self()); } void setsig(int foo) { struct sigaction action; memset(&action, 0, sizeof(action)); sigemptyset(&action.sa_mask); action.sa_handler = handler; if (sigaction(foo,&action, NULL) == -1) perror("sigaction"); } int main(int argc, char *argv[] ) { pthread_t t; setsig(SIGTERM); pthread_create(&t, NULL, foo, NULL); fprintf(stderr,"main %p\n", pthread_self()); while(1) { pause(); fprintf(stderr,"main awaken\n"); } }