每个进程都有自己的信号屏蔽字,但是在一个线程中调用signal或者sigaction等函数会改变所以线程中的信号处理函数,而不是仅仅改变调用signal/sigaction的那个线程的信号处理函数。在POSIX标准中定义了一些用于进程信号处理的接口。
pthread_sigmask
#include <signal.h>
int pthread_sigmask(int how, const sigset_t *restrict set,
sigset_t *retrict oset);
与sigprocmask相同,每个线程均有自己的信号屏蔽集(信号掩码),可以使用pthread_sigmask函数来屏蔽某个线程对某些信号的 响应处理,仅留下需要处理该信号的线程来处理指定的信号。
sigwait
#include <siganl.h>
int sigwait(const sigset_t *restrict set, int *restrict signop);
sigwait() 提供了一种等待信号的到来,以串行的方式从信号队列中取出信号进行处理的机制。sigwait()只等待函数参数中指定的信号集,即如果新产生的信号不在指定的信号集内,则 sigwait()继续等待。
这里注意:
- 对于非实时信号,相同信号不能在信号队列中排队;对于实时信号,相同信号可以在信号队列中排队。
- 如果信号队列中有多个实时以及非实时信号排队,实时信号并不会先于非实时信号被取出,信号数字小的会先被取出。
pthread_kill
#include <signal.h>
int pthread_kill(pthread_t thread, int signo);
在多线程程序中,一个线程可以使用pthread_kill对同一个进程中指定的线程(包括自己)发送信号。