wait_event_interruptible两种写法的差异及signal_pending相关疑问
关于wait_event_interruptible两种写法的差异及返回值理解
两种写法的功能差异(并非风格不同)
这两段代码存在实际功能差异,核心区别在于对「条件满足唤醒但同时存在未处理信号」场景的处理:
- 第一段代码:先调用
wait_event_interruptible(data->wait, !data->loops),不依赖它的返回值,再通过signal_pending(current)检测。如果此时进程存在未处理信号,哪怕wait_event_interruptible是因为条件满足返回0,也会返回-ERESTARTSYS。 - 第二段代码:仅判断
wait_event_interruptible的返回值。只有当它因被信号中断返回非零值(实际是-ERESTARTSYS)时,才返回错误;如果是条件满足返回0,哪怕此时有未处理信号,也会继续执行后续逻辑。
简单来说,第一段的逻辑是「只要有未处理信号,不管等待是否正常完成,都返回错误」;第二段是「只有等待被信号打断时才返回错误,正常完成等待的话,哪怕有信号也继续执行」。
关于返回值的理解纠正
你的理解是错误的:wait_event_interruptible的返回值规则明确:
- 返回0:表示等待的条件已满足,进程被正常唤醒。
- 返回**-ERESTARTSYS**(负数):表示进程被可处理的信号中断,等待未正常完成。
而signal_pending(current)是检测当前进程是否存在未处理信号,它的结果和wait_event_interruptible的返回值并非完全等价:比如进程因条件满足唤醒后,可能刚好收到了信号,此时wait_event_interruptible返回0,但signal_pending(current)为真。
内容的提问来源于stack exchange,提问作者bielu000
相关产品推荐
相关产品推荐

