为什么sigwait()不尊重sigset的变化?

时间:2016-02-24 06:18:55

标签: kernel pthreads posix

在pthreads中:假设我有一个线程来处理CTRL + C输入,初始化为:

sigemptyset(&set);
sigaddset(&set, SIGINT);
pthread_sigmask(SIG_BLOCK, &set, NULL);
pthread_create(&ctrlc_handler, NULL, ctrlc_handler_impl, data);

然后线程启动并等待带有sigwait()的SIGINT:

int signal;
sigwait(&set, &signal);

现在,如果我需要取消阻止(并且取消或销毁)此线程,我现在能够做到的唯一方法就是发送一个SIGINT明确地使用pthread_kill(..., SIGINT)。虽然这种方法效果很好,但它感觉非常具有侵入性和脱离背景。也许通过使用:sigdelset(&set, SIGINT)从sigset中删除SIGINT来简单地取消阻塞此线程会更清晰。由于sigset变空,sigwait()会选择它并取消阻塞。但由于某种原因,这不起作用。这可能是一个早期的设计决定,我很好奇为什么它不起作用。

1 个答案:

答案 0 :(得分:4)

传递到sigwait的信号集的第一个障碍很可能被复制到内核中;与此同时,你正在操纵原始副本。

specification of sigwait中没有任何内容表示从另一个线程操纵set会对等待线程产生任何影响。

这样的规范是相当不合理的,因为它会增加对用户空间中的数据对象的内存操作的要求,以便捕获到调度程序中以唤醒线程。