作为精通Linux系统的IT工程师,我来详细解释线程与信号的复杂关系。
sigaction()设置的处理函数会被所有线程继承解决方案:
// 在主线程设置信号处理
struct sigaction sa;
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sigaction(SIGINT, &sa, NULL);
// 工作线程阻塞这些信号
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGINT);
pthread_sigmask(SIG_BLOCK, &set, NULL);
解决方案:
// 创建专用信号处理线程
void* signal_thread(void* arg) {
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
int sig;
while(1) {
sigwait(&set, &sig);
// 处理信号
}
return NULL;
}
解决方案:
// 临时阻塞关键信号
sigset_t oldset, newset;
sigemptyset(&newset);
sigaddset(&newset, SIGALRM);
pthread_sigmask(SIG_BLOCK, &newset, &oldset);
// 执行关键代码
pthread_sigmask(SIG_SETMASK, &oldset, NULL);
sigwait()或signalfd()而非信号处理程序理解这些概念和模式可以帮助您构建更健壮的多线程Linux应用程序。