当我遇到这段代码并评论时,我正在阅读有关 pselect 系统调用的使用......
static void handler(int sig) { /* do nothing */ }
int main(int argc, char *argv[])
{
fd_set readfds;
struct sigaction sa;
int nfds, ready;
sa.sa_handler = handler; /* Establish signal handler */
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGINT, &sa, NULL);
/* ... */
ready = select(nfds, &readfds, NULL, NULL, NULL);
/* ... */
}
this solution suffers from a race condition: if the SIGINT signal is delivered after
the call to sigaction(), but before the call to select(), it will fail to interrupt
that select() call and will thus be lost.
现在我不确定 sigaction 系统调用...最初我认为它有点保存一个与信号相对应的处理程序,仅此而已......当信号到达时,它会寻找它的处理程序并执行处理程序......但如果这是正确的,那么对应于信号的处理程序将被保存为整个程序,并在信号到达时执行......因此,无论信号和选择之间的持续时间有多短,信号都会被处理......
但是这段代码使信号看起来只有在与 sigaction 的调用/执行相吻合时才被处理......调用完成后,信号将不会由 sigaction 为程序的其余部分设置的处理程序处理(我知道,听起来很荒谬)
请解释!!
您需要在文章的上下文中查看该代码 - 代码正在尝试安排信号来中断select()
。提到的争用条件不会导致sigaction()
或信号处理程序以任何方式失败 - 它只是注意到信号有可能在sigaction()
调用和select()
调用之间传递,这使得该模式无法接受实现所需的结果。您是对的,sigaction()
后任何时间到达的信号都将被处理,无论是在signal()
之前、期间还是之后。但是,这不能用于可靠地为select()
提供早期中断路径,这就是本文的上下文。