日期:2014-05-16  浏览次数:20822 次

单单一个wait_event_interruptible()就能唤醒自己?
wait_event_interruptible()。该函数修改task的状态为TASK_INTERRUPTIBLE,意味着改进程将不会继续运行直到被唤醒,然后被添加到等待队列wq中。
在wait_event_interruptible()中首先判断condition是不是已经满足,如果是则直接返回0,否则调用__wait_event_interruptible(),并用__ret来存放返回值
---------------------------
#define wait_event_interruptible(wq, condition) \
({ \
  int __ret = 0; \
  if (!(condition)) \
  __wait_event_interruptible(wq, condition, __ret);\
  __ret; \
})
wait_event_interruptible() --> __wait_event_interruptible()
__wait_event_interruptible()首先定义并初始化一个wait_queue_t变量__wait,其中数据为当前进程current,并把__wait入队。
   
在无限循环中,__wait_event_interruptible()将本进程置为可中断的挂起状态,反复检查condition是否成立,如果成立
则退出,如果不成立则继续休眠;条件满足后,即把本进程运行状态置为运行态,并将__wait从等待队列中清除掉,从而进程能够调度运行。如果进程当前有
异步信号(POSIX的),则返回-ERESTARTSYS。

那既然这样,也就是单单一个wait_event_interruptible()就能唤醒自己 ?
我在某处
int flag = 0;
wait_event_interruptible(wq,flag !=0);
就会睡眠了,那我在其他函数里:flag =1 ;
按照上面的说法,进程就唤醒了??那要wake_up_interruptible()干嘛???? 


------解决方案--------------------
281/**
 282 * wait_event_interruptible - sleep until a condition gets true
 283 * @wq: the waitqueue to wait on
 284 * @condition: a C expression for the event to wait for
 285 *
 286 * The process is put to sleep (TASK_INTERRUPTIBLE) until the
 287 * @condition evaluates to true or a signal is received.
 288 * The @condition is checked each time the waitqueue @wq is woken up.
 289 *
 290 * wake_up() has to be called after changing any variable that could
 291 * change the result of the wait condition.
 292 *
 293 * The function will return -ERESTARTSYS if it was interrupted by a
 294 * signal and 0 if @condition evaluated to true.
 295 */


看看函数丶注释,你做了任何可能改了条件判断结果的修改后,需要自己调用wake_up 来唤醒的。


__wait_event_interruptible 只是把自己调度出去,进程就休眠了,等待别人的唤醒。 你单纯的吧flag改成1他是不知道的,就像一个人一样在那睡觉呢,你要把它弄醒了,然后他才有机会检查条件是不是满足了,然后决定继续睡还是成功返回然后干活去。