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
来源:CSDN
作者:崔家寨大当家
链接:https://blog.csdn.net/wanzhilin88/article/details/104405147