snifer

【原创】Linux系统Poll和select操作

0
阅读(2269)

学过linux的同学都知道,Pollselect操作非常重要,今天就简单写写这方面的内容。

poll和select操作:


进程中调用poll和select操来查询打开的I/O设备文件是否可做非阻塞读写
驱动程序中unsigned int (*poll) (struct file *, poll_table *)来实现poll和select操作
通过poll_wait可以向驱动向poll_table结构添加一个等待队列
驱动的poll函数应该实现返回那个操作可以立即完成而无需休眠
POLLIN,POLLOUT,POLLDNORM,POLLERR
Linux/poll.h
int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

其中readfds、writefds、exceptfds分别是被select()监视的读、写和异常处理的文件描述符集合,numfds的值是需要检查的号码最高的文件描述符加1。timeout参数是一个指向struct timeval类型的指针,它可以使select()在等待timeout时间后若没有文件描述符准备好则返回。

poll()函数典型模板

 static unsigned int xxx_poll(struct file *filp, poll_table *wait)

 {

   unsigned int mask = 0;

  struct xxx_dev *dev = filp->private_data; /*获得设备结构体指针*/

   ... 

  poll_wait(filp, &dev->r_wait, wait);//加读等待队列头

  poll_wait(filp, &dev->w_wait, wait);//加写等待队列头

   if (...)//可读

   {

           mask |= POLLIN | POLLRDNORM; /*标示数据可获得*/

  }  

   if (...)//可写

   {

          mask |= POLLOUT | POLLWRNORM; /*标示数据可写入*/

     }

     ...

     return mask;

   }

这方面的相关内容大家最好能实际运行操作一下,印象会更深。


Baidu
map