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

来源:互联网 发布:王珊数据库第五版 编辑:程序博客网 时间:2024/06/06 13:14

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。


0 0
原创粉丝点击