Chinaunix首页 | 论坛 | 博客
  • 博客访问: 230217
  • 博文数量: 59
  • 博客积分: 1215
  • 博客等级: 少尉
  • 技术积分: 575
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-09 02:18
文章分类

全部博文(59)

文章存档

2012年(53)

2011年(6)

分类: 嵌入式

2012-02-03 02:11:09

第八章主要讲的是阻塞跟非阻塞I/O。要注意,这里不是教我们怎样用I/O,是教我们怎么样在驱动中支持阻塞或非阻塞I/O。

在Linux驱动中,可以使用等待队列来实现阻塞进程的唤醒。我们来看一下源码吧。

这个结构体里面包含了task_struct,可以知道是基于任务列表的。关于具体的操作可以看书。内核中用于改变进程状态的set_current_state()或者_add_current_state()函数直接为current->state赋值也是可以的。

那么我们怎么样支持阻塞与非阻塞呢:看书上例子:

第7行:DECLARE_WAITEQUEUE(wait, current);             这是把当前进程定义为等待队列。注意current在内核当中就是代表当前进程。

第10行:add_wait_queue(&dev->r_wait, &wait);          这是把刚才定义的等待队列放到度等待队列。

接下去的循环好理解,当还没有内容的时候,如果非阻塞的话,就跳出去,如果阻塞,则把当前进程睡眠了。注意测试是否阻塞的方法:测试filp->f_flags是否设置了非阻塞。

 

下面一节是关于轮询的,select和poll用的可够多了吧,那怎么支持他们呢。其实他们两个对应的文件操作是poll,我们实现这个函数的时候,主要是内核中的poll_wait操作。这个函数的作用是把当前进程添加到wait参数指定的等待列表中,还有就是返回的时候要返回设备资源的可获取状态。具体看例子就可以了。突然对poll和epoll的实现感兴趣。好吧,明天深入追踪一下源码,写一篇博客。

阅读(1491) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~