目前我正在网络编程中我碰到的功能PSELECT的一个(附带的概念),它解决了选择,即问题的信号。使用select(),在intr_flag的测试和选择的调用之间有问题,如果信号发生,如果永远选择块,它将会丢失。怎么做PSELECT块使用信号屏蔽在网络编程
if (intr_flag)
handle_intr(); /* handle the signal */
if ((nready = select(...)) < 0) {
if (errno == EINTR) {
if (intr_flag)
handle_intr();
}
然而,它说,随着PSELECT,我们现在可以代码这个例子中可靠地
sigset_t newmask, oldmask, zeromask;
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGINT);
sigprocmask(SIG_BLOCK, &newmask, &oldmask); /* block SIGINT */
if (intr_flag) //here
handle_intr(); /* handle the signal */
if ((nready = pselect (... , &zeromask)) < 0) {
if (errno == EINTR) { //here
if (intr_flag)
handle_intr();
}
...
}
,它给出的代码是可靠的解释是 - 测试intr_flag变量之前,我们阻止SIGINT。当pselect被调用时,它用空集(即零掩码)替换进程的信号掩码,然后检查描述符,可能会进入睡眠状态。但是,当pselect返回时,在调用pselect(即SIGINT被阻止)之前,进程的信号掩码会重置为其值。
但与PSELECT上面的代码中提到的,我们阻止信号那么如何才能检查错误EINTR?由于pselect会阻塞所有信号,因此当发生中断时,它应该阻止中断或被传送到进程。只有当pselect返回时才能传递信号。
根据在其前面的评论这里提及,中断或仍然可能发生信号PSELECT被调用之前在两者之间的第一检查和PSELECT或当PSELECT称为矛盾阻挡中断的目的,行任何其他信号,因此应该导致竞争条件,因为选择在那里。
请谁能解释这是怎么可能的,因为我是新来的这些概念。
很好的解释:)谢谢! –
不客气。 –