poll查询

来源:互联网 发布:网络访问安全设计 编辑:程序博客网 时间:2024/05/29 07:17

应用程序开发过程,读写一个设备之前,常常需要查询一下设备是否有数据可读写,可以通过查询,然后根据查询的结果进行下一步的操作。这样的操作叫做轮循操作,需要应用层与驱动层配合使用,以下直接说明:

应用层:

1 定义要轮询的设备文件描述符并将其初始化,代码:

struct pollfd pfds; //定义轮询设备

memset(&pfds,0,sizeof(pfds));

pfds->POLL | POLOUT;

fd=open("xxx",O_RDWR);

pfds->fd=fd;

2 调用poll函数轮询多个设备描述符

3.根据poll返回输出信息,判断是哪个设备发生了什么事件,然后应用程序做相应的处理。


  驱动层:

1.定义设备驱动的轮询等待队列和状态标志

 wait_queue_head_t poll_wq_write
int full_flag

2,在探测函数probe初始化函数中初始化轮询等待队列

init_waitqueue_head(wait_queue_head_t * q)


3.实现设备驱动程序的POLL函数,设备驱动程序的POLL函数主要做两件事情;

(1)调用POLL函数,将当前进程加入到设备的轮询队列中;

(2)根据设备标志位返回设备的当前状态信息

如代码:

unsigned int mixled_poll(struct file *file,  poll_table  *wait)
{
    unsigned int mask = 0;

    poll_wait(file, &Elmixled_dev->poll_wq_write,wait );


   if(1 == Elmixled_dev->full_flag )
   {
      // device have something to read
       mask |= POLLIN;

   }

   return mask;
}