wait_event_interruptible 使用方法

1. 关于 wait_event_interruptible() 和 wake_up()的使用  
  
读一下wait_event_interruptible()的源码,不难发现这个函数先将 当前进程的状态设置成TASK_INTERRUPTIBLE,然后调用schedule(), 而schedule()会将位于TASK_INTERRUPTIBLE状态的当前进程从runqueue 队列中删除。从runqueue队列中删除的结果是,当前这个进程将不再参 与调度,除非通过其他函数将这个进程重新放入这个runqueue队列中, 这就是wake_up()的作用了。 
  
由于这一段代码位于一个由condition控制的for(;;)循环中,所以当由shedule()返回时(当然是被wake_up之后,通过其他进程的schedule()而再次调度本进程),如果条件condition不满足,本进程将自动再次被设 置为TASK_INTERRUPTIBLE状态,接下来执行schedule()的结果是再次被 从runqueue队列中删除。这时候就需要再次通过wake_up重新添加到 runqueue队列中。  如此反复,直到condition为真的时候被wake_up. 
  
可见,成功地唤醒一个被wait_event_interruptible()的进程,需要满足: 

1)condition为真,(条件2的前提)wait_event_interruptible函数的第二个参数

2) 调用wake_up()。 

所以,如果你仅仅修改condition,那么只是满足其中一个条件,这个时候, 被wait_event_interruptible()起来的进程尚未位于runqueue队列中,因此不会被 schedule。这个时候只要wake_up一下就立刻会重新进入运行调度。 
  
2. 关于wait_event_interruptible的返回值   
根据 wait_event_interruptible 的宏定义知:  
   1) 条件condition为真时调用这个函数将直接返回0,而当前进程不会被wait_event_interruptible和从runqueue队列中删除。   
   2) 如果要被wait_event_interruptible的当前进程有nonblocked pending signals, 那么会直接返回-ERESTARTSYS(i.e. -512),当前进程不会 被wait_event_interruptible 和从runqueue队列中删除。 
  
   3) 其他情况下,当前进程会被正常的wait_event_interruptible,并从runqueue队列中删除,进入TASK_INTERRUPTIBLE状态退出运行调度,直到再次被唤醒加入runqueue队列中后而参与调度,将正常返回0。 
  
附1:wait_event_interruptible  宏   
#define wait_event_interruptible(wq, condition)    \ 
({                                                 \ 
     int __ret = 0;                                  \ 
     if (!(condition))                               \ 
      __wait_event_interruptible(wq, condition, __ret); \ 
      __ret;                                         \ 
})   
注: C语言中{a,b, ..., x}的的值等于最后一项,即x,因此上述 宏的值是 __ret。 
  
  
附2:wait_event_interruptible()和 wake_up的等效代码  
wait_event_interruptible(wq, condition) /*等效没有考虑返回值*/ 

     if (!(condition)) 
     { 
         wait_queue_t _ _wait; 
         init_waitqueue_entry(&_ _wait, current); 
         add_wait_queue(&wq, &_ _wait); 
         for (;;) 
         { 
            set_current_state(TASK_INTERRUPTIBLE); 
            if (condition) 
            break; 
            schedule();  /* implicit call: del_from_runqueue(current)*/ 
         } 
         current->state = TASK_RUNNING; 
         remove_wait_queue(&wq, &_ _wait); 
      } 
}  
void wake_up(wait_queue_head_t *q) 

      struct list_head *tmp; 
      wait_queue_t *curr; 
      list_for_each(tmp, &q->task_list) 
      { 
        curr = list_entry(tmp, wait_queue_t, task_list); 
        wake_up_process(curr->task); 
        /* implicit call: add_to_runqueue(curr->task);*/ 
        if (curr->flags) 
          break; 
      } 

  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: wait_event_interruptible是Linux内核中一个函数,它用于在进程睡眠时等待某个事件的发生。它会检查等待的条件,如果条件已经满足,则立即返回;否则,进程会被置于睡眠状态,直到条件被满足或者被中断。 ### 回答2: wait_event_interruptible是Linux内核中一个等待事件发生的函数。它可以让当前进程进入睡眠状态,并等待某个事件的发生。 wait_event_interruptible函数的原型如下: int wait_event_interruptible(wait_queue_head_t *queue, int condition); 其中,wait_queue_head_t是等待队列的头部,condition是一个判断条件,当条件为真时,进程会被唤醒。 wait_event_interruptible函数的作用是,如果condition条件不满足,进程将进入可打断睡眠状态,并放入等待队列中,直到有其他进程唤醒它。而如果condition条件成立,表示事件已经发生,进程将不会进入睡眠状态,继续执行后续代码。 在睡眠状态中,如果进程接收到一个信号(如SIGINT),wait_event_interruptible函数就会返回,进程会被唤醒。 wait_event_interruptible函数经常与wake_up_interruptible函数一起使用。wake_up_interruptible函数用于唤醒一个睡眠中的进程,而wait_event_interruptible函数则用于判断是否需要进程进入睡眠状态。 wait_event_interruptible函数的使用可以实现进程之间的同步和通信。例如,一个进程可以等待另一个进程完成某个任务,然后再继续执行。这样可以有效地利用CPU资源,并保证进程之间的协作顺利进行。 总之,wait_event_interruptible函数是Linux内核中用于等待事件发生的函数,它可以让进程进入睡眠状态,并等待某个条件的满足。 ### 回答3: wait_event_interruptible是Linux内核提供的一个函数,用于在内核中等待指定的事件发生。 当一个进程调用wait_event_interruptible时,它进入了睡眠状态,直到指定的事件被触发。这个事件通常是一个条件的变化,如某个标志位被设置、一个信号被发送等。在等待过程中,进程被置于可中断的状态,这意味着如果收到一个信号(如SIGINT或SIGTERM),进程可以被唤醒并执行相应的信号处理函数。 wait_event_interruptible使用通常需要与wake_up_interruptible配合使用。当事件发生时,需要调用wake_up_interruptible来唤醒等待该事件的进程。唤醒后,被唤醒的进程会检查事件是否已经发生,并根据具体情况采取相应的处理措施,如继续执行或者返回错误码。 wait_event_interruptible函数的作用是可靠地等待事件发生,避免了忙等待(busy-waiting)的情况。在实际应用中,wait_event_interruptible可以提高系统的性能和资源利用率,因为它允许其他任务在某个事件触发之前执行并使用CPU。 总之,wait_event_interruptible是Linux内核提供的一个功能强大的等待事件发生的函数,通过将进程置于睡眠状态,并可中断地等待事件发生,可以实现高效、可靠地等待事件的发生。它在多种应用场景中被广泛使用,如设备驱动、网络协议和文件系统等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值