使用非阻塞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的更多相关文章

  1. 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序

    嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...

  2. 【转】linux设备驱动程序中的阻塞机制

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...

  3. linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)

    原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...

  4. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

  5. Linux设备驱动程序学习之分配内存

    内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...

  6. 教你写Linux设备驱动程序:一个简短的教程

    教你写Linux设备驱动程序:一个简短的教程 http://blog.chinaunix.net/uid-20799298-id-99675.html

  7. linux设备驱动程序_hello word 模块编译各种问题集锦

    在看楼经典书籍<linux设备驱动程序>后,第一个程序就是编写一个hello word 模块. 原以为非常easy,真正弄起来,发现问题不少啊.前两天编过一次,因为没有记录,今天看的时候又 ...

  8. Linux设备驱动程序学习----1.设备驱动程序简介

    设备驱动程序简介 更多内容请参考Linux设备驱动程序学习----目录 1. 简介   Linux系统的优点是,系统内部实现细节对所有人都是公开的.Linux内核由大量复杂的代码组成,设备驱动程序可以 ...

  9. Linux设备驱动程序学习----2.内核模块与应用程序的对比

    内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...

随机推荐

  1. 在开源UOJ的导航栏中添加新页面链接

    前言 刚用开源UOJ搭建OJ成功时就想在导航栏那里添加一个站内页面链接,无奈当时乱搞水平低,网上也没有教程,不晓得怎么弄 今天突然来了闲情乱搞一通,结果还真乱搞成了...特意写下为后来人少走点弯路 前 ...

  2. javaIO——PipedReader 和 PipedWriter 实现模拟即时聊天

    上一篇学习了javaIO里面的 PipedReader 和 PipedWriter,这里对两个类做一个小小的练习:实现一个即时消息发送和接收的聊天系统(这里只实现单向发送,双向同理,定义两个管道即可) ...

  3. vue.js devtools图标不亮

    第一步:打开谷歌扩展程序 第二步:设置允许访问文件地址

  4. MFC基础笔记

    List Control // List Control初始化,下面代码需要放在OnInitDialog()函数里面// 设置扩展风格:正行选中 m_list.SetExtendedStyle(LVS ...

  5. Android项目笔记整理(1)

    第二部分 工作项目中以及平时看视频.看书或者看博客时整理的个人觉得挺有用的笔记 1.Activity界面切换:   if(条件1){        setContentView(R.layout.ma ...

  6. 配置Linux内核

  7. Winform 多项目共用AssemblyInfo解决方案

    Winform 多项目共用AssemblyInfo解决方案: 操作步骤如下: 第一步:复制任何项目中的AssemblyInfo.cs文件至指定目录 第二步:删除所有项目的AssemblyInfo.cs ...

  8. Comparator分组测试

    import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.u ...

  9. SVN建立分支和合并代码

    1.SVN建立分支正确SVN服务器上会有两个目录:trunk和branches.trunk目录下面代码就是所谓的主版本,而branches文件夹主要是用来放置分支版本.分支版本是依赖于主版本的,因此建 ...

  10. selenium之chromedriver与谷歌浏览器映射,到谷歌71.0版本的

    转载出处: https://blog.csdn.net/huilan_same/article/details/51896672