Linux kernel 中使用 wait_event_interruptible(wq, condition) 使进程睡眠

本文详细介绍了Linux内核中的等待队列机制,包括wait_event_interruptible和wait_event_timeout函数的使用方式及其内部实现原理。通过具体的宏定义展示了如何在内核代码中实现进程的挂起与唤醒。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

wait_event_interruptible(wq, condition)  修改当前进程为TASK_INTERRUPTIBLE状态,并把进程添加到等待队列wq中, 意味着该进程要等到被唤醒时才能继续运行,或者被信号中断;如果没有被唤醒或者中断,它会一直等下去。

wait_event_interruptible(wq, condition)  就是用来等待condition为真, condition 一般是一个表达式,每次查看condition时都可能不一样。在wait_event_interruptible(wq, condition)  中首先判断 condition 条件是否为真,如果为真,则返回 0;否则,调用 __wait_event_interruptible(wq, condtion),并把返回值保存到_ret中。

#define wait_event_timeout(wq, condition, timeout) \
({ \
long __ret = timeout; \
if (!(condition)) \
__wait_event_timeout(wq, condition, __ret); \
__ret; \
})


__wait_event_interruptible(wq, condition, ret) 也是一个宏,定义如下


#define __wait_event_interruptible(wq, condition, ret) \
do { \
DEFINE_WAIT(__wait); \
\
for (;;) { \
prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE); \
if (condition) \
break; \
if (!signal_pending(current)) { \
schedule(); \
continue; \
} \
ret = -ERESTARTSYS; \
break; \
} \
finish_wait(&wq, &__wait); \
} while (0)

其中,prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE) 先把进程放入等待队列wq中,然后把进程状态设备 TASK_INTERRUTIBLE。检查 condition 是否为真,为真则中断循环。检查是否有没有处理的信号, 如果没有,则调用schedule(),让出CPU。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值