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. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...
随机推荐
- Introduction to Deep Learning Algorithms
Introduction to Deep Learning Algorithms See the following article for a recent survey of deep learn ...
- # 使用scatter()绘制散点图
使用scatter()绘制散点图 之前写过一篇,使用magic function快速绘图的教程了:https://www.cnblogs.com/jiading/p/11750001.html.但这种 ...
- c#向指定的邮箱发送邮件
private bool SendEmail(string fileName) { MailMessage m_Mail = new MailMessage(); m_Mail.From = new ...
- asp.net ListView控件的简单实用和配置
1 web窗体界面代码 ItemType:控件要绑定的实体模型 SelectMethod:控件获取实体集合的后台方法 DataKeyNames:实体的主键 UpdateProduct:设置跟新的方法 ...
- Flutter 38: 图解 Flutter 基本动画 (二)
小菜前两天学习了以下 Animation 的基本动画,接下来小菜学习以下稍微进阶版的 Animation 动画. 复合动画 小菜前两天学习的主要是基本的单一动画,当然多个动画效果集一身也是毫无问题的, ...
- SAS.EnhancedEditor.dll 已加载,但找不到入口点DLLRegisterServer
SAS.EnhancedEditor.dll 已加载,但找不到入口点DLLRegisterServer 重新安装EnhancedEditor 安装Microsoft.NET Framework 3.5 ...
- bootstrapTable post提交数据,后台无法接收的问题
解决方法:contentType:"application/x-www-form-urlencoded; charset=UTF-8",
- python产生错误:can only concatenate str (not "int") to str
代码为: #!/usr/bin/python # _*_ coding:utf-8_*_ # print("hello world!") name = input("na ...
- Mac&Appium&Python自动化测试-Appium安装
基础配置 1.JAVA和Git就不用多说了 2.Brew,也就是homebrew,它是MacOSX上的软件包管理工具,它就等同于linux上的apt-get.yum,如果没有安装,可以通过如下命令安装 ...
- (转)为什么收到三个重复的ACK意味着发生拥塞?
三次重复的ACK,可能是丢包引起的,丢包可能是网络拥塞造成的,也可能是信号失真造成的. 三次重复的ACK,也有可能是乱序引起的,而乱序和网络拥塞没有直接关系. 如果就写这两行,感觉什么都没写,接下来的 ...