借助定向于线程的信号的概念,对 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() 时不存在中断系统调用的危险。