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。