|
5#

楼主 |
发表于 2009-11-7 16:46:56
|
只看该作者
sleep_on() , sleep_on_timeout() 以及 interruptible_sleep_on() 几个接口,尽管在 2.6 内核中仍得到支持,但在将来的 2.7 内核里会被移除,而用 wait_event*() 来取代 sleep_on*() 。
wait_event*() 接口包含:
wait_event(), wait_event_interruptible() , wait_event_interruptible_timeout() 。
下图是几个函数的调用示意图:
![]()
要使用 wait_event_interruptible() 宏,在 2.6 内核里要包含 <linux/wait.h> 头文件;在 2.4 内核里要包含 <linux/sched.h> 头文件。wait_event_interruptible() 的格式为:wait_event_interruptible(wq, condition); wq 为等待队列;
condition 表示释放 wait_event_interruptible() 的条件。注意,由于宏是替换性结构,所以 conditon 不是变量,可以是个逻辑表达式,这由 wait_event_interruptible() 的定义也可以看到:
#define wait_event_timeout(wq, condition, timeout) \\
({ \\
long __ret = timeout; \\
if (!(condition)) \\
__wait_event_timeout(wq, condition, __ret); \\
__ret; \\
}) 如下应用:DECLARE_WAIT_QUEUE_HEAD(WaitQueue_Read);
... ...
wait_event_interruptible(WaitQueue_Read, count>30); 上面,把当前进程注册到 WaitQueue_Read 等待队列上,并进入睡眠状态,然后,中断服务函数使用 wake_up_interruptible() 唤醒 &WaitQueue_Read 等待队列上注册的进程,若 count 的值小于 30 ,就会重新进入睡眠状态。由 __wait_event_timeout() 可知,它是一个无限循环 ( for ( ; ; ) ),一旦检测到 condition 为真,才会 break 出循环,停止等待。
此外,还有一个 wait_event_interruptible_timeout() ,其结构为:wait_event_interruptible_timeout(wq, condition, timeout); 最后一个参数 timeout 是超时设定。 |
|