博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux 设备驱动--- Poll 方法 --- Select【转】
阅读量:6690 次
发布时间:2019-06-25

本文共 1748 字,大约阅读时间需要 5 分钟。

转自:

 

目录

 

在驱动 ( 内核空间 )  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 函数中.

 

          

你可能感兴趣的文章
win7控制面板中网络适配器不可见
查看>>
iPhone X的UI设计技巧
查看>>
编辑器
查看>>
马哥笔记第十六天故障排除、trap、sed、awk、bash数组、bash字符串操作
查看>>
在ubuntu系统中配置《汇编语言的编程艺术》开发环境
查看>>
关闭windows的默认共享
查看>>
react开发环境搭建
查看>>
数据库读写分离
查看>>
spark-submit性能调优
查看>>
三年的职业生涯
查看>>
Linux身份验证策略
查看>>
社交是微信营销
查看>>
2008 R2 证书服务器应用详解
查看>>
hive 动态分区太多问题
查看>>
Windows Server 2008 RemoteApp(二)---部署激活远程桌面授权服务器
查看>>
读取日志文件开发总结
查看>>
IOS --React Native
查看>>
Linux CPU
查看>>
用模板实现顺序表与单链表
查看>>
Linux/Centos ntp时间同步,联网情况和无网情况配置
查看>>