Unix sigaction信号处理
当我看到这段代码和注释时,我正在阅读关于pselect系统调用的使用Unix sigaction信号处理,unix,event-handling,signals,signal-handling,Unix,Event Handling,Signals,Signal Handling,当我看到这段代码和注释时,我正在阅读关于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
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);
/* ... */
}
现在我不确定sigaction系统调用…最初我认为它有点保存了一个与信号对应的处理程序,就是这样…当信号到达时,它会查找它的处理程序并执行处理程序…但是如果这是正确的,那么与信号对应的处理程序将保存整个系统无论信号何时到达,程序都会执行…因此无论sigaction和select之间的持续时间多么短,信号都会被处理 但是这段代码使得信号似乎只有在与sigaction的调用/执行一致时才被处理…调用完成后,信号将不会由sigaction为程序的其余部分设置的处理程序处理(我知道,这听起来很荒谬)
请解释 您需要在本文的上下文中查看该代码-该代码试图安排一个中断信号
select()
。所提到的竞争条件不会导致sigaction()
或信号处理程序以任何方式失败-只是注意到有可能在sigaction()
调用和select()
调用之间传递信号,这使得该模式无法达到预期的结果。您是对的,在sigaction()
之后的任何时间到达的信号都将被处理,无论是在signal()之前、期间还是之后。但是,这不能可靠地为select()
提供早期中断路径,这正是本文的内容。代码是否分叉任何进程或设置管道?此代码段中是否缺少任何相关代码?这是我能看到的唯一一个创建竞态条件的条件。@squiguy…我认为这与此无关…我从@twalberg处获取了此信息…我现在明白了…只有一个问题…如果在select()阻塞时出现信号,则知道select()返回…但在它返回后,是我们设置的处理程序自动处理的信号,或者我们必须显式调用处理程序…我的理解是,如果信号发生在select()
睡眠时,处理程序会被调用,然后当处理程序返回时,系统会确定我们处于select()
在信号之前,并安排select()
返回,指示信号中断。因此,select()。
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.