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. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...
随机推荐
- python3 多线程 采集 xpath
#!/usr/bin/python # -*- coding: UTF-8 -*- '''Thread3 多线程测试采集''' import threading,time,queue,Mongo_ut ...
- CNN 笔记
1. 卷积后的图像的大小为 (w+2p-f)*3 / s W为图像的宽,p为padding的大小, f为卷积核大小, 3 为图像的通道数, s为步长 2. 卷积层和池化层的区别? 卷积层是 ...
- Linux更新程序脚本
DATE=$(date +%Y%m%d_%H%M%S) cd /opt/anystreaming/transcoder/ mv dll/libmonitor_service.so "dll/ ...
- SQLServer从渣仔到小白
一.将查询结果插入到另一张表 1. 查询结果插入新表 select * into tableA from tableB where … 2. 查询结果插入已经存在的表 insert into tabl ...
- windows连接远程服务器报错'SSH' 不是内部或外部命令,也不是可运行的程序 或批处理文件 解决方案
网上在windows下连接远程服务器的步骤如下: 1.打开cmd命令行窗口 2.输入cd ~/.ssh,进入c盘下的.ssh文件 3.输入“ssh root@远程服务器的ip地址”连接远程服务器, b ...
- java实现判定新旧版本号
废话不多说,直接上代码 /** * 判断是否为最新版本方法 将版本号根据.切分为int数组 比较 * * @param localVersion 本地版本号 * @param onlineVersio ...
- 转载一篇让你全面了解什么是.NET。
转载于:https://www.52abp.com/BlogDetails/10009 阅读文本大概需要 8 分钟. 持续进化的 .NET 这张图即是一个学习的路线图同样他也是 .NET 平台的进化图 ...
- 0502 xss 实验
0x01 dvwa xss(reflected) 1.1 Security Level: low use the typical <script>alert(1)</script&g ...
- Mina TCP服务端客户端 示例
服务端代码: package com.xd.nms.example; import java.io.IOException; import java.net.InetSocketAddress; im ...
- SpringBoot+MyBatis+Mysql 6.X 版本日期型数据获,时间错乱,jason序列化时间相差8小时问题
新项目是用的springboot+mybatis+mysql 6.0.6版本的驱动包来搭建的,在使用的过程中遇到以下2个问题 从mysql取的的数据日期时间,与真实的时间往后错乱了14个小时. spr ...