Linux设备驱动程序 之 poll和select
使用非阻塞IO的应用程序经常使用select,poll,epoll系统调用;它们的功能本质上是一样的:都允许进程决定是否可以对一个或者多个打开的文件做非阻塞的读取或者写入;这些电泳也会阻塞进程,直到给定的文件描述符中的任何一个可读取或者写入;因此,它们常常用于那些需要使用多个输入或者输出流而又不会阻塞于其中任何一个流的应用程序中;同一功能之所以要由多个独立的函数提供,是因为其中两个几乎是由两个不同的Unix团体分别实现的:select在BSD中引入,而poll由SystemV引入;epoll系统调用则用于将poll函数扩展到能够处理数千个文件描述符;
poll在file_operations结构中的定义如下:
unsigned int (*poll) (struct file *, struct poll_table_struct *);
|
1
|
unsigned int (*poll) (struct file *, struct poll_table_struct *);
|
当用户空间程序在驱动程序关联的文件描述符上执行select,poll,epoll系统调用时,该驱动程序的方法将被调用;该poll函数的功能分为两步:
1. 在一个或者多个可指示poll状态变化的等待队列上调用poll_wait;如果当前没有文件描述符可用来执行IO,则内核将进程在传递到该系统调用的所有文件描述符对应的等待队列上等待;
static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p)
2. 返回一个用来描述操作是否可以立即无阻塞执行的位掩码;
POLLIN-如果设备可以无阻塞的读取,就设置该位;
POLLRDNORM-如果通常的数据已经就绪,就可以读取,就应该设置该位;一个可读设备返回POLLIN|POLLRDNORM;
POLLRDBAND-指示可以从设备读取out-of-band带外数据;
POLLPRI-可以无阻塞的读取高优先级(即out-of-band)的数据;设置该位会导致select报告文件发生一个异常,这是由于select把out-of-band数据作为异常对待;
POLLHUP-当读取设备的进程到达文件尾时,驱动程序必须设置POLLHUP位,调用select的进程会被告知设备是可读的;
POLLERR-设备发生了错误;如果调用poll,就会报告设备既可以读也可以写,因为读写都会无阻塞的返回一个错误码;
POLLOUT-如果设备可以无阻塞的写入,就在返回值中设置该位;
POLLWRNORM-该位和POLLOUT的意义一样,有时其实就是同一个数字;一个可写的设备将返回POLLOUT|POLLWRNORM;
POLLWRBAND-与POLLRDBAND类似,这一位标识具有非零优先级的数据可以被写入设备;只有数据报的poll实现中使用了这一位,因为数据报可以传输out-of-band数据;
POLLRDBAND和POLLWRBAND只在于套接字相关的文件描述符中才有意义,设备驱动程序通常用不到这两个标记;
随意从内核摘取了一段代码,对上面描述的两个步骤体现的很明确;
static unsigned int evdev_poll(struct file *file, poll_table *wait)
{
struct evdev_client *client = file->private_data;
struct evdev *evdev = client->evdev;
unsigned int mask; poll_wait(file, &evdev->wait, wait); if (evdev->exist && !client->revoked)
mask = POLLOUT | POLLWRNORM;
else
mask = POLLHUP | POLLERR; if (client->packet_head != client->tail)
mask |= POLLIN | POLLRDNORM; return mask;
}
Linux设备驱动程序 之 poll和select的更多相关文章
- 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序
嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...
- 【转】linux设备驱动程序中的阻塞机制
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...
- linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)
原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...
- Linux设备驱动程序 第三版 读书笔记(一)
Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...
- Linux设备驱动程序学习之分配内存
内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...
- 教你写Linux设备驱动程序:一个简短的教程
教你写Linux设备驱动程序:一个简短的教程 http://blog.chinaunix.net/uid-20799298-id-99675.html
- linux设备驱动程序_hello word 模块编译各种问题集锦
在看楼经典书籍<linux设备驱动程序>后,第一个程序就是编写一个hello word 模块. 原以为非常easy,真正弄起来,发现问题不少啊.前两天编过一次,因为没有记录,今天看的时候又 ...
- Linux设备驱动程序学习----1.设备驱动程序简介
设备驱动程序简介 更多内容请参考Linux设备驱动程序学习----目录 1. 简介 Linux系统的优点是,系统内部实现细节对所有人都是公开的.Linux内核由大量复杂的代码组成,设备驱动程序可以 ...
- Linux设备驱动程序学习----2.内核模块与应用程序的对比
内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...
随机推荐
- ubuntu中安装字体雅黑和consolas
Ubuntu的群体里偏向使用雅黑,我目前用的YaHei.Consolas 1.11 版本 (雅黑-Consolas的混合体) http://www.netmako.com/RobertLee/YaHe ...
- Tomat服务器学习
Tomat服务器学习 使用的是Redhat版本的Tomcat 目录结构 bin:可执行文件 conf:配置文件 lib:tomcat运行时依赖的jar包 logs:日志文件 temp:临时文件 web ...
- 手工实现HttpBasic校验
HttpBasic: 是RFC中定义的一种控制HTTP协议访问资源的方式.具体当HTTP请求受限资源时,就需要在请求头中添加以"Authorization"为key的heade ...
- js 中, set 与 数组 相互转换
主要用 Array.from 方法 1.array --> set (数组转set) let array = [1, 2, 3, 4]; let set = new Set(array); 2. ...
- vue+element-ui 项目中实现复制文字链接功能
需求: 点击复制按钮,复制一个链接 在GitHub上找到一个clipboard组件,功能比较齐全 使用方法: 安装 npm i clipboard --save HTML <template ...
- Rabbitmq各方法的作用详解
exchange_declare('direct_logs', 'direct', false, false, false);// 这个是申明交换器,如果没有申明就给默认队列的这个交换器,而且发送的类 ...
- 简单介绍 Java 构造器
导读 构造器是编程的强大组件.使用它们来释放 Java 的全部潜力. 在开源.跨平台编程领域,Java 无疑(?)是无可争议的重量级语言.尽管有许多伟大的跨平台框架,但很少有像 Java 那样统一和直 ...
- textbox 输入值提示。。。(类似百度搜索)
public void textBox5_xiala() { DataSet ds = SQl_yuji.ds_cinvname(); this.textBox5.AutoCompleteMode = ...
- linux——实际工作中如何使用linux
实际工作中,linux系统都不会在我们自己的电脑上,linux系统安装在机房的服务器上,我们操作linux不可能跑到机房去,所以我们需要有一个工具,能在公司通过网络远程连接到机房的linux服务器上 ...
- Ubuntu系统--安装官方flash插件包的方法
浏览器安装官方install_flash_player_npapi_linux.x86_64.tar.gz插件包的方法 第一步:下载安装包. adobe flash player的官方下载instal ...