You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:02:11