Linux 设备驱动--- 阻塞型字符设备驱动 --- O_NONBLOCK --- 非阻塞标志【转】
转自:http://blog.csdn.net/yikai2009/article/details/8653697
版权声明:本文为博主原创文章,未经博主允许不得转载。
阻塞:
在设计简单字符驱动程序时,要注意一个重要问题.
当一个设备无法立刻满足用户的读写请求时应当如何处理?
例如:调用 read 时没有数据可读,但以后可能会有;
或者一个进程试图向设备写入数据,但是设备暂时没有准备好接收数据.
应用程序通常不关心这种问题,应用程序只是调用 read 或 write 并得到返回值.
驱动程序应当 ( 缺省地 ) 阻塞进程,使它进入睡眠,直到请求可以得到满足.
阻塞操作:
是指在执行设备操作时,若不能获得资源则挂起进程,直到满足可操作的条件后进行操作,
被挂起的进程进入睡眠状态,被从调度器的运行队列移走,直到等待的条件被满足.
非阻塞操作:
进程不能进行设备操作时并不挂起,他或者放弃,或者不停的查询,直到可以进行操作为止.
阻塞方式-read- 实现:
在阻塞型驱动程序中,read 实现方式如下:
如果进程调用 read ,但设备 没有数据 或 数据不足,进程阻塞.
当新数据到达后,唤醒被阻塞进程.
阻塞方式-write- 实现:
非阻塞方式的读写操作:
实例 --- 读阻塞的实现:



实例 --- 按键驱动阻塞实现:
1,在 open 函数 查看看是 阻塞方式 还是 非阻塞方式:
- if (file->f_flags & O_NONBLOCK) /* 非 阻塞操作 */
- {
- if (down_trylock(&button_lock)) /* 无法获取信号量,down_trylock 立马返回 一个 非零值 */
- return -EBUSY;
- }
- else /* 阻塞操作 */
- {
- /* 获取信号量 */
- down(&button_lock); /* 获取不到 睡眠 */
- }
2,在 read 函数中同样查看:
- if (file->f_flags & O_NONBLOCK) /* 非 阻塞操作 */
- {
- if (!ev_press) /* ev_press 为 1 表示有按键按下,为 0 if 成立 ,没有按键按下, */
- return -EAGAIN; /* 返回 -EAGAIN 让再次来执行 */
- }
- else /* 阻塞操作 */
- {
- /* 如果没有按键动作, 休眠 */
- wait_event_interruptible(button_waitq, ev_press);
- }
3,应用程序中:
1,以阻塞方式运行:
- int main(int argc, char **argv)
- {
- unsigned char key_val;
- int Oflags;
- fd = open("/dev/buttons", O_RDWR );
- if (fd < 0)
- {
- printf("can't open!\n");
- return -1;
- }
- while (1)
- {
- read(fd, &key_val, 1);
- printf("key_val: 0x%x\n", key_val);
- }
- return 0;
- }
2,以非阻塞方式运行:
- int main(int argc, char **argv)
- {
- unsigned char key_val;
- int ret;
- int Oflags;
- fd = open("/dev/buttons", O_RDWR | O_NONBLOCK);
- if (fd < 0)
- {
- printf("can't open!\n");
- return -1;
- }
- while (1)
- {
- ret = read(fd, &key_val, 1);
- printf("key_val: 0x%x, ret = %d\n", key_val, ret);
- sleep(5);
- }
- return 0;
- }
非阻塞方式,没有按键值按下,程序立马返回;
read 返回值 为 -1;
Linux 设备驱动--- 阻塞型字符设备驱动 --- O_NONBLOCK --- 非阻塞标志【转】的更多相关文章
- 【转】linux设备驱动程序之简单字符设备驱动
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/03/2272869.html 一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用 ...
- Linux 驱动框架---cdev字符设备驱动和misc杂项设备驱动
字符设备 Linux中设备常见分类是字符设备,块设备.网络设备,其中字符设备也是Linux驱动中最常用的设备类型.因此开发Linux设备驱动肯定是要先学习一下字符设备的抽象的.在内核中使用struct ...
- 驱动开发--【字符设备、块设备简介】【sky原创】
驱动开发 字符设备,块设备,网络设备 字符设备 以字节流的方式访问, 不能随机访问 有例外,显卡.EEPROM可以随机访问 EEPROM可以擦写1亿次,是一种字符设备,可以随机访问 读写是 ...
- Samsung_tiny4412(驱动笔记03)----字符设备驱动基本操作及调用流程
/*********************************************************************************** * * 字符设备驱动基本操作及 ...
- LCD驱动分析(一)字符设备驱动框架分析
参考:S3C2440 LCD驱动(FrameBuffer)实例开发<一> S3C2440 LCD驱动(FrameBuffer)实例开发<二> LCD驱动也是字符设备驱动,也 ...
- Linux驱动开发2——字符设备驱动
1.申请设备号 #include <linux/fs.h> int register_chrdev_region(dev_t first, unsigned int count, char ...
- 【linux驱动笔记】字符设备驱动相关数据结构与算法
欢迎转载,转载时需保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...
- 初入android驱动开发之字符设备(一)
大学毕业,初入公司,招进去的是android驱动开发工程师的岗位,那时候刚进去,首先学到的就是如何搭建kernel.android的编译环境,然后就是了解如何刷设备以及一些最基本的工具.如adb.fa ...
- Linux驱动开发之字符设备模板
/***************************** ** 驱动程序模板* 版本:V1* 使用方法(末行模式下):* :%s/xxx/"你的驱动名称"/g********* ...
随机推荐
- 17-比赛1 F - 较小元素 Weak in the Middle (set)
Seg-El has last chance to make the final changes in order to prevent the destruction of Krypton. He ...
- python基础之面向对象编程介绍、类和对象
面向对象变成介绍 面向过程编程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西.主要应用在一旦完成很少修改的地方,如linux ...
- Hadoop三大发行版本
apache 提供基础版本 cloudera 主要是修改Hadoop,提供更加稳定的发行版本,以及可视化的管理服务,主要产品如下: CDH:Cloudera Distributed Hadoop Cl ...
- TouTiao开源项目 分析笔记11 以总体到局部的思路 构建图片主列表
1.构建图片主列表的整体片段PhotoTabLayout 1.1.首先创建一个PhotoTabLayout片段 public class PhotoTabLayout extends Fragment ...
- nodejs基础1
nodejs学习网站: https://github.com/alsotang/node-lessons 1.全局对象 (1)node中没有window对象,有global对象替代window对象 g ...
- Django笔记 —— 入门简介
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- iterm2+vim使用
iterm2+vim 终端切换为iterm2+zsh+oh my zsh,确实好用. I term2常用快捷键记录 新建标签:cmd+t 关闭标签:cmd+w 切换标签:cmd+数字, 切换全屏:cm ...
- 搭建 MongoDB分片(sharding) / 分区 / 集群环境
1. 安装 MongoDB 三台机器 关闭防火墙 systemctl stop firewalld.service 192.168.252.121 192.168.252.122 192.168.25 ...
- android DOM解析Xml
文章转自:http://blog.sina.com.cn/s/blog_a661f16c0101d5qp.html People类是自己写的一个类,主要保存各个字符串数据. 由于没学过Xml语法只 ...
- selenium webdriver——JavaScript警告窗处理
在WebDriver中处理JavaScript所生成的alert.confirm以及prompt,具体方法是使用switch_to_alert()方法定位到alert.confirm以及 prompt ...