转自:http://blog.csdn.net/yikai2009/article/details/8653842

版权声明:本文为博主原创文章,未经博主允许不得转载。

 
 

在驱动 ( 内核空间 )  Poll 方法  对应的是 Select 系统调用 ( 用户空间 ).

Poll  ------------------------->   Select

Select - 系统调用 int select - 功能:

Seclect 系统调用用于多路监控,当没有一个文件满足要求时,Select将阻塞调用进程.

函数:

int   select  ( int  maxfd , fd_set *readfds , fd_set  * writefds , fe_set  *exceptfds , const stuct timeval * timeout )  .

参数:

Maxfd : 文件描述符的范围,比待检测的最大文件描述符 大 1 .

Readfds :被读检测的文件描述符集.

Writefds  :被写监控的文件描述符集.

Exceptfds:被异常监控的文件描述符集.

Timeout   :定时器.

Timeout 取不同的值。该调用有不同的表现:

1,Timeout 值为 0,不管是否有文件满足要求,都立刻返回.

无文件满足要求返回 0 ,有文件满足要求返回一个正值.

2,Timeout 为 NULL .Select 将阻塞进程. 直到某个文件满足要求.

3,Timeout 为正整数,就是等待的最长时间,即 Select 在 Timeout 时间内阻塞进程.

返回值:

Select 调用返回时,返回值有如下情况:

1,正常情况下返回满足要求的文件描述符个数.

2,经过了 Timeout 等待后仍无文件满足要求,返回值为 0 .

3,如果 Select 被某个信号中断,它将返回 -1 并 设置 errno 为 EINTR .

4,如果出错,返回 -1 并设置相应的 errno .

Select - 系统调用- 使用方法:

1,将要监控的文件添加到文件描述符集.

2,调用 Select 开始监控.

3,判断文件是否发生变化.

四个宏对描述符集进行操作 -  FD_SET - FD_CLR - FD_ZERO - FD_ISSET :

         系统提供了 4 个宏对描述符集 进行操作:
                  #include  < sys/select.h >
                  void  FD_SET ( int  fd , fd_set * fdset )      将文件描述符 fd  添加到文件描述集 fdset 中.
                  void  FD_CLR ( int  fd , fd_set * fdset )     从文件描述符集 fdset  中清除文件描述符 fd .
                  void  FD_ZERO ( fd_set * fdset )               清空文件描述符集 fdset .
                  void  FD_ISSET ( int  fd , fd_set * fdset )  在调用 Select 后 使用该宏 来检测文件描述符集 fdset 中文件 fd 发生了变化.
eg:
           
 

Poll 方法 - 驱动中 int (*poll) :

         应用程序常常使用 Select 系统调用,它可能会阻塞进程.
         这个调用由驱动的 Poll 方法来实现,原型为:
         unsigned  int  ( *poll ) ( struct  file * filp , poll_table * wait )
 

Poll 设备方法负责完成 - 驱动中 :

使用 poll_wait  将等待队列添加到 poll_table 中:

         1,使用 poll_wait  将等待队列添加到 poll_table 中.

返回描述设备是否 可读 或者 可写 的掩码 - POLLIN :

         2, 返回描述设备是否可读或者可写的掩码.
                           位掩码:
                                    POLLIN   :设备可读.
                                    POLLRDNORM : 数据可读.
                                    POLLOUT  :设备可写.
                                    POLLWRNORM  :数据可写.
                           设备可读通常返回 ( POLLIN  |   POLLRDNORM )
                           设备可写通常返回 ( POLLOUT  |   POLLWRNORM )                 

eg:

Poll 工作原理:

Poll 方法只是做一个登记,真正的阻塞发生在 select.c 中的 do_select 函数中.

Linux 设备驱动--- Poll 方法 --- Select【转】的更多相关文章

  1. Linux高级字符设备驱动 poll方法(select多路监控原理与实现)

    1.什么是Poll方法,功能是什么? 2.Select系统调用(功能)      Select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程.      int selec ...

  2. linux设备驱动归纳总结(三):6.poll和sellct【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-61749.html linux设备驱动归纳总结(三):6.poll和sellct xxxxxxxxxx ...

  3. 【Linux开发】linux设备驱动归纳总结(三):6.poll和sellct

    linux设备驱动归纳总结(三):6.poll和sellct xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  4. linux设备驱动第四篇:驱动调试方法

    http://www.cnblogs.com/donghuizaixian/archive/2015/04/02/4387083.html 上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神, ...

  5. linux设备驱动第四篇:从如何定位oops的代码行谈驱动调试方法

    上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试.在普通的c应用程序中,我们经常使用printf来输出信息,或者使用gdb来调试程序 ...

  6. Linux 设备驱动 Edition 3

    原文网址:http://oss.org.cn/kernel-book/ldd3/index.html Linux 设备驱动 Edition 3 By Jonathan Corbet, Alessand ...

  7. Linux设备驱动中的阻塞和非阻塞I/O

    [基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...

  8. linux 设备驱动概述

    linux 设备驱动概述 目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer):       主要利用C库函数和 ...

  9. 华清远见Linux设备驱动(每章小结)

    1.  linux设备驱动是以内核模块的方式而存在的,在具体的驱动开发中将驱动编译为模块具有很到的工程意义.因为如果将正在开发中的驱动编译如内核,而开发过程中会不断修改驱动代码,则需要不断的编译和重启 ...

随机推荐

  1. 笔记-select,poll,epoll

    笔记-select,poll,epoll 1.      I/O多路复用 I/O多路复用是指:通过一种机制或一个进程,可以监视多个文件描述符,一旦描述符就绪(写或读),能够通知程序进行相应的读写操作. ...

  2. 16 Django-admin管理工具

      admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTAL ...

  3. Hibernate---数据操作示例BY实体类注释

    通过实体的映射文件创建表的示例,除了基本jar包外,还需要jar包如下 ejb3-persistence.jar.hibernate-annotations.jar这两个包均在hibernate-an ...

  4. 亲手搭建一个基于Asp.Net WebApi的项目基础框架1

    目标:教大家搭建一个简易的前后端分离的项目框架. 目录: 1:关于项目架构的概念 2:前后端分离的开发模式 3:搭建框架的各个部分 这段时间比较闲,所以想把之前项目里用到的一些技术写到博客里来,分享给 ...

  5. VSX-5 VSXMusic 编码听音乐

    给VS写个扩展来听音乐的说法,缘来已久,这两天做了个初版,使用豆瓣FM,先发出来. 插件现在只做了VS2013的,别的版本有待下一步支持. 现在暂时只有一个Adornment(就是那个有封面的),一个 ...

  6. 《算法》C++代码 SPFA

    SPFA的全称是Shortest Path Faster Algorithm,一看名称八成就是中国人起的名字,因为外国人起算法名称一般都会写上自己的名字,很少谦虚.实际上,这是西南交通大学段凡丁同学于 ...

  7. excel批量导入

    https://www.cnblogs.com/mingyue1818/p/4828865.html

  8. 使用BootStrapValidator来完成前端输入验证

    BootStrapValidator可以用于完成基于BootStrap搭建的前端UI中的输入验证,由于本插件完全基于BootStrap因此可以和UI完美的融合在一起.下面直接上图,看看完成后的结果: ...

  9. linux备忘录-vi和vim

    知识点 vi的三种模式 一般模式 按 ESC 可回到一般模式 相关按键 j 代表 向下按钮 k 代表 向上按钮 h 代表 向左按钮 l 代表 向右按钮 20j 等代表 向下移动20行 Ctrl + f ...

  10. python 常见的错误类型 和 继承关系

    BaseException +-- SystemExit #系统结束 +-- KeyboardInterrupt #键盘中断 ctrl+D +-- GeneratorExit #主动结束 +-- Ex ...