一、阻塞必要性:如调用read,设备没有数据,但是以后会有,或者一个进程试图向设备写入数据,但是设备暂时还没准备好接受数据,这些类似情况下驱动程序应该(缺省的)阻塞进程,使它进入等待状态,直到情况可以满足。
二、内核等待队列:就是阻塞的进程的“候车室”
使用方法:
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参数所指定的等待队列上。
5、从等待队列中唤醒进程:wake_up(wait_queue_t *q),从等待队列q中唤醒状态为TASK_UNINTERRUPTIBLE、TASK_INTERRUPTIBLE、 TASK_KILLABLE的所有进程
wake_up_interruptible(wait_queue_t *q),从队列q中唤醒状态为TASK_INTERRUPTIBLE的进程