我一直在阅读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的调用检查的内容相同。我说的对吗
2条答案
按热度按时间jdzmm42g1#
两个代码段都在等待队列上等待,如果等待被信号中断,则返回
-ERESTARTSYS
。可以避免在wait_event_interruptible()
之后调用signal_pending()
,因为后者已经在信号中断的情况下返回-ERESTARTSYS
(参见其定义的文档字符串注解)。第二个代码片段似乎是实现逻辑的更简洁的方法。您应该检查代码的其余部分,看看是否有显式调用
signal_pending()
的突出原因。如果有信号要传递,第一个函数可能希望提前返回,而不管wait_event_interruptible()
的结果如何。pgpifvop2#
如果条件初始为真,
wait_event_interruptible()
将返回0而不休眠。第一个代码段总是检查挂起的信号。第二个代码片段只在实际需要等待条件变为true时检查挂起信号。