在调用read、write等方法时,如果此时驱动无法满足要求时应该做何处理,例如当调用read系统调用时此时没有数据可读,或者调用write系统调用时没有空间供调用进程写入,调用进程是不会考虑这些事情的,它只是简单的调用read、write系统调用并等待它们的返回,那么这个时候应该阻塞调用进程,使它进入睡眠直到可操作时。
那么在driver中使用等待队列来实现,等待队列由一个等待队列头来管理,等待队列头结构定义如下(linux/wait.h):
可以使用宏DECLARE_WAIT_QUEUE_HEAD静态定义并初始化一个等待队列头,也可以使用init_waitqueue_head来动态初始化,例如:
内核使用wait_event等宏来使进程睡眠,宏定义如下:
wait_event为不可中断睡眠,这个不是很常用,应该使用wait_event_interruptible,而以timeout结尾的表示睡眠等待一段时间,不论condition条件是否满足都返回,以jiffies为单位。
wait_event是睡眠,与之对应的是唤醒,宏定义如下:
那么在driver中使用等待队列来实现,等待队列由一个等待队列头来管理,等待队列头结构定义如下(linux/wait.h):
struct __wait_queue_head {
spinlock_t lock;
struct list_head task_list;
};
typedef struct __wait_queue_head wait_queue_head_t;
可以使用宏DECLARE_WAIT_QUEUE_HEAD静态定义并初始化一个等待队列头,也可以使用init_waitqueue_head来动态初始化,例如:
wait_queue_head_t my_queue;
init_waitqueue_head(&my_queue);
内核使用wait_event等宏来使进程睡眠,宏定义如下:
wait_event(wq, condition)
wait_event_interruptible(wq, condition)
wait_event_timeout(wq, condition, timeout)
wait_event_interruptible_timeout(wq, condition, timeout)
其中wq是等待队列头,condition是等待条件,睡眠等待直到为真。
wait_event为不可中断睡眠,这个不是很常用,应该使用wait_event_interruptible,而以timeout结尾的表示睡眠等待一段时间,不论condition条件是否满足都返回,以jiffies为单位。
wait_event是睡眠,与之对应的是唤醒,宏定义如下:
wake_up(wait_queue_head_t *wq)
wake_up_interruptible(wait_queue_head_t *wq)
其中wake_up与wait_event对应,wake_up_interruptible与wait_event_interruptible对应。