linux wait_event_interruptible和signal_pending

42fyovps  于 2023-05-28  发布在  Linux
关注(0)|答案(2)|浏览(124)

我一直在阅读LDD3这本书,我偶然发现了以下代码:

int somefunc()
{
   [...]

    wait_event_interruptible(data->wait, !data->loops);
    if (signal_pending(current))
        return -ERESTARTSYS;
}

然而,在本书的其他一些部分,作者使用了一点不同的方法(至少对我来说)做同样的事情。

int someOtherFunc()
{
   [...]

    if (wait_event_interruptible(data->wait, !data->loops)) {
      return -ERESTARTSYS;
   }
}

这两者有什么区别吗?或者这只是一个风格的问题?
据我所知,wait_event_interruptible的非负返回代码表明调用被某个信号源中断,因此它看起来与对signal_pending的调用检查的内容相同。我说的对吗

jdzmm42g

jdzmm42g1#

两个代码段都在等待队列上等待,如果等待被信号中断,则返回-ERESTARTSYS。可以避免在wait_event_interruptible()之后调用signal_pending(),因为后者已经在信号中断的情况下返回-ERESTARTSYS(参见其定义的文档字符串注解)。第二个代码片段似乎是实现逻辑的更简洁的方法。
您应该检查代码的其余部分,看看是否有显式调用signal_pending()的突出原因。如果有信号要传递,第一个函数可能希望提前返回,而不管wait_event_interruptible()的结果如何。

pgpifvop

pgpifvop2#

如果条件初始为真,wait_event_interruptible()将返回0而不休眠。第一个代码段总是检查挂起的信号。第二个代码片段只在实际需要等待条件变为true时检查挂起信号。

相关问题