借助定向于线程的信号的概念,对 UNIX 信号机制得到了扩展。定向于线程的信号就像普通的异步信号一样,但定向于线程的信号是被发送到特定线程,而不是进程。
与安装用于处理信号的信号处理程序相比,使用等待异步信号的单独线程可能更安全且更简单。
一种处理异步信号的更好方式是同步处理这些信号。通过调用 sigwait(2),线程可以一直等待,直到信号出现为止。请参见等待指定信号。
main() { sigset_t set; void runA(void); int sig; sigemptyset(&set); sigaddset(&set, SIGINT); pthread_sigmask(SIG_BLOCK, &set, NULL); pthread_create(NULL, 0, runA, NULL, PTHREAD_DETACHED, NULL); while (1) { sigwait(&set, &sig); printf("nestcount = %d\n", nestcount); printf("received signal %d\n", sig); } } void runA() { A(4,4); exit(0); }
本示例将修改示例 5–1 的代码。主例程将屏蔽 SIGINT 信号,创建一个子线程(用于调用前一个示例的函数 A),并发出 sigwait() 来处理 SIGINT 信号。
请注意,信号在计算线程中将被屏蔽,因为计算线程将从主线程继承其信号掩码。当且仅当主线程在 sigwait() 内部不受阻塞时,才能受到保护,而不去处理 SIGINT。
另外,请注意,使用 sigwait() 时不存在中断系统调用的危险。