int pthread_sigmask(int how,const sigset_t * newmask, sigset_t * oldmask); int pthread_kill(pthread_t thread,int signo); int sigwait(const sigset_t * set, int * sig); 以上这些函数包含在signal.h中。
这三个函数如果正确执行,返回值都为0。如果发生错误,则pthread_sigmask()和pthread_kill()函数返回值不为0,并且相应的错误代码被设置;sigwait()是线程取消点,总是返回0. pthread_sigmask()函数用来改变或者设置线程的信号屏蔽(signal mask),newmask用来执行信号屏蔽,设置信号屏蔽以前的信号屏蔽被存放到oldmask指向的位置。改变的方式由第一个参数how决定。如果how是SIG_SETMASK把信号屏蔽值设置为newmask;如果how是SIG_BLOCK,那么在newmask中指定的信号就添加到了当前信号的屏蔽中;如果how是SIG_UNBLOCK,那么newmask中指定的信号从当前信号屏蔽中被删除。 pthread_sigkill()函数可以向其它线程发送信号。 sigwait()挂起调用sigwait()的线程,直到收到第一个参数set指向的信号集中指定的信号,且等待到信号被存放到第二个参数sig指向的位置。这里需要注意的是,在多线程情况下,执行sigwait()的时侯,sigwait()的第一个参数指向的信号集中的信号必须被阻塞。如果sigwait()等待的信号有相应的信号处理函数将不被调用。 在linux中,使用sigset_t数据类型存放信号集合。对信号集合的操作的GNU C library提供了一些函数:
int sigemptyset(sigset_t * set); int sigfillset(sigset_t * set); int sigaddset(sigset_t * set); int sigdelset(sigset_t * set); int sigismember(const sigset_t * set,int signo); 以上这些函数包含在signal.h中
void * thread1(void * arg) { sigset_t newmask,oldmask,waitset; int ret_val; int signo;
sigemptyset(&waitset); sigemptyset(&newmask);
//initialize the signal set,and block signal SIGUSR1 while waiting for signal SIGUSR2 sigaddset(&newmask,SIGUSR1); //initialize the signal set,and wait for SIGUSR2 sigaddset(&waitset,SIGUSR2);
void * thread2(void * arg) { sleep(1); cout<<"the ID of thread 2 is:"< pthread_kill(pt[0],SIGUSR1); cout<<"thread 2 has sent SIGUSR1 to thread 1"< pthread_kill(pt[0],SIGUSR2); cout<<"thread 2 has send SIGUSR2 to thread 2"< pthread_exit(0); }
if(kill_rc == ESRCH) printf("the specified thread did not exists or already quit/n"); else if(kill_rc == EINVAL) printf("signal is invalid/n"); else printf("the specified thread is alive/n");