阻塞型I/O

在调用read、write等方法时,如果此时驱动无法满足要求时应该做何处理,例如当调用read系统调用时此时没有数据可读,或者调用write系统调用时没有空间供调用进程写入,调用进程是不会考虑这些事情的,它只是简单的调用read、write系统调用并等待它们的返回,那么这个时候应该阻塞调用进程,使它进入睡眠直到可操作时。

那么在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对应。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值