多线程环境下,对信号的处理变得更加复杂,因为同一个进程的每一个子线程都可以收到信号, 并且共享信号处理函数。所以此时要定义一个专门的线程来进行信号的处理。
主要有以下两个步骤:
1,在主线程创建第一个线程之前就调用sigpromask函数的的pthread版本:pthread_sigmask进行信号的屏蔽(屏蔽那些你想要收到并处理的信号, 这样非信号处理线程就不会收到这些信号了)。int pthread_sigmask(int how, const sigset_t *newmask, sigset_t *oldmask),成功时返回0。
2, 在信号处理线程中调用int sigwait(const sigset_t &set, int *sig)函数,成功时返回0。输入的set即是第一步中的信号掩码, 表示等待所有被屏蔽的信号,并且将收到的信号存储在sig中。此时不应该定义信号处理函数,因为信号到来时,sigwait和信号处理函数只有一个能起作用。直接根据sig的值进行相应的信号处理即可。
参考于《Linux高性能服务器编程》游双