文件IO之多路复用-poll

回眸只為那壹抹淺笑 提交于 2020-02-21 06:55:47

1.函数原型

#include <poll.h>

int poll(struct pollfd *fds, nfds_t nfds, int timeout)

参数1:多个文件描述符的集合,为一个数组指针 

             struct pollfd{

                int fd;                 // 文件描述符

                short events;  // 期望监控的文件描述符事件:PLLIN,PLLOUT,PLLERR

                short revents;  // 事件结果:PLLIN,PLLOUT,PLLERR

             };

参数2:被监控的文件描述符的个数

参数3:监控的时间,单位为ms,负数表示-无限监控

返回值:负-出错,正-监控到有效事件,0-监控时间到。

2.用法-应用程序中怎么调用poll

   a.打开要监控的文件,并保存文件描述符到struct follfd fds[]数组中。并将要监控的文件描述符信息填到

      fds[]数组中。

      struct follfd fds[2]; // 建立要监控的文件描述符数组

      // 初始化数组,将要监控的文件描述符信息填入数组。

      fds[0].fd = STDIN  //打开的文件描述符

      fds[0].event = POLLIN  //监听的事件

 

      fds[1].fd = STDERR  //打开的文件描述符

      fds[1].event = POLLIN  //监听的事件

   b.调用poll函数

      int ret = poll(fds, 2, -1);   // 监控2个文件,不设超时时间

   c.判断poll函数返回值

     if(0>ret)

     {

         //出错处理

         perror("poll");

         exit(1);

     }

     else if(0<ret) //监控到事件

     {

         // 判断监控到哪个文件

         if(fds[0].revent & POLLIN)

        {

              // 读取文件的代码放在这里。

        }

     }

3.用法-驱动中怎么实现poll机制

   应用程序中使用了poll调用,那么驱动中就必须实现poll接口。否则应用程序的poll调用会立刻返回成功。

   a.在驱动中注册一个wait_queue_head_t类型的等待队列,在模块入口函数中初始化它。当驱动接收到有效数据

      的时候要唤醒等待队列在的进程。比如按键驱动中,在按键的中断处理函数中要唤醒等待的进程。

   b.驱动中的poll函数原型

      unsigned int (*poll) (struct file *, struct poll_table_struct)

   c.驱动的poll接口要完成的任务:

       1> 调用poll_wait,将当前的等待队列注册到系统中

            poll_wait(struct file *filp, wait_queue_heat_t *wait_address, poll_talbe *p);

       2> 驱动的poll函数要返回一个mask值。

             当数据未准备好时mask=0,当数据准备好时mask=POLLIN/POLLOUT

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!