7.5.1 概念
7.5.2 pthread_sigmask
7.5.3 pthread_kill 和 sigwait
[glibc-manual]34.9 线程与信号处理 -- 函数: int pthread_sigmask (int HOW, const sigset_t *NEWMASK, sigset_t *OLDMASK) -- 函数: int sigwait (const sigset_t *SET, int *SIG) 如果希望 sigwait 能可靠地工作,被等待的信号应该在所有线程中均被阻塞,而不仅仅是调用线程。否则,POSIX 信号语义无法保证调用 sigwait 的线程一定能够收到这个信号。最佳方法是,在创建任何线程之前阻塞这些信号,并保证在除调用 sigwait 之外的情况中不会取消阻塞。 LinuxThreads 中的信号处理与 POSIX 标准相去甚远。根据标准规定,“异步”(外部)信号的目标是整个进程(所有线程的集合),而进程将信号传递给某个特定的线程。收到信号的线程可能是任意一个当前没有阻塞该信号的线程。 在 LinuxThreads 实现中,每个线程均为一个具有单独 PID 的核心进程,因此外部线程总是发送到某个特定线程。例如,当另外一个线程在 sigwait 中阻塞时,它无法被这个信号唤醒。 LinuxThreads 中的 sigwait 实现在阻塞过程中为 SET 中的线程设置了傀儡句柄。因为信号句柄会在所有线程中共享,其它线程不可以自己为这些信号设置句柄;另一种方案是其它线程均阻塞这些信号(这始终是推荐的处理方法)。 PS:注意!信号处理动作(终止或暂停)会影响整个进程! |
