3、Linux设备驱动---轮询操作poll()函数

 

1.轮询的概念和作用

   使用非阻塞I/O的应用程序通常会使用select()和poll()系统调用查询是否可对设备进行无阻塞的访问。select()和poll()系统调用最终会引发设备驱动中的poll()函数被执行。

2.应用程序中的轮询编程---select()函数

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

     int select(int maxfds, fd_set *readfds, fd_set *writefds, fd_set

                               *exceptfds, struct timeval *timeout)

 maxfds:文件描述符的范围,是待检测的最大文件描述符加1

 readfds:被读监控的文件描述符集

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

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

 timeout:它可以使select()在等待timeout时间后若没有文件描述符准备好

          则返回

          struct timeval *timeout {

               int tv_set;

               int tv_uset;

          }

          timeout的值有如下三种情况:

          0:不管是否有文件满足要求,都立即返回,无文件满足要求返回

              0,有文件满足要求时返回一个正值(结构体内成员为0)

         NULL:select将阻塞进程,直到某个文件满足要求(指针为空)

         正整数:就是等待的最长时间,即select在timeout时间内阻塞进程

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

         2)经过了timeout时间等待后仍无文件满足要求,返回值为0

         3)如果select被某个信号中断,返回-1并设置errno为EINTR

         4)如果出错,返回-1并设置errno为EINTR

  下列操作用来设置、清除、判断文件描述符集合:

     FD_ZERO(fd_set *set)   //清除一个文件描述符集:

     FD_SET(int fd,fd_set *set) //将一个文件描述符加入文件描述符集中

     FD_CLR(int fd,fd_set *set) //将一个文件描述符从文件描述符集中清除

     FD_ISSET(int fd,fd_set *set) //判断文件描述符是否被置位

      

 

3.设备驱动中的轮询编程---poll()函数

   unsigned int (*poll)(struct file *filp, struct poll_table *wait)

 poll设备方法完成两件事:

   1)对可能引起设备文件状态变化的等待队列调用poll_wait()函数,将对应

     的等待队列头添加到poll_table

   2)返回表示是否能对设备进行无阻塞读、写访问的掩码

poll_wait()函数:用于向poll_table注册等待队列

   void poll_wait(struct file *filp, wait_queue_head_t *queue,                       

                                                  poll_table *wait)   

poll_wait()函数所做的工作是把当前进程添加到wait参数指定的等待队列

(poll_table)中                   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值