在linux驱动程序设计中,可以使用等待队列来实现进程的阻塞,等待队列可以看做保存进程的容器,在阻塞进程时,将进程放入等待队列,当唤醒进程时,从等待队列中取出进程。
linux2.6内核提供了以下关于等待队列的操作
1定义等待队列
wait_queue_head_t my_queue
2初始化等待队列
init_waitqueue_head(&my_queue)
3定义并初始化等待队列
DECLARE_WAIT_QUEUE_HEAD(my_queue)
4有条件睡眠
wait_event(queue,condition)
当condition为真时,立即返回;否则让进程进入TASK_UNINTERRUPTIBLE模式的睡眠,并挂载queue参数所指定的等待队列上。
wait_event_interruptible(queue,condition)
当condition为真时,立即返回;否则让进程进入TASK_INTERRUPTIBLE的睡眠,并挂载queue参数所指定的等待队列上。
int wait_event_killable(wait_queue_t queue,condition)
当条件为真时,立即返回,否则让进程进入TASK_KILLABLE的睡眠,并挂在queue参数所指定的等待队列上。
5无条件睡眠(老版本,建议不再使用)
sleep_on(wait_queue_head_t *q)
让进程进入不可中断的睡眠,并把它放入等待队列q
interruptible_sleep_on(wait_queue_head_t *q)
让进程进入可中断的睡眠,并把它放入等待队列q。
6--从等待队列中唤醒进程
wake_up(wait_queue_t *q)
从等待队列中唤醒状态为TASK_UNINTERRUPTIBLE,TASK_INTERRUPTIBLE,TASK_KILLABLE的所有进程。
wake_up_interruptible(wait_queue_t *q)
从等待队列中唤醒状态为TASK_INTERRUPTIBLE的进程。