Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix sigaction信号处理_Unix_Event Handling_Signals_Signal Handling - Fatal编程技术网

Unix sigaction信号处理

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

当我看到这段代码和注释时,我正在阅读关于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);
/* ... */
}

现在我不确定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.