Linux驱动下的poll操作函数(Linux内核中的轮询机制)

一. 简介

如果用户应用程序以非阻塞的方式访问设备,设备驱动程序就要提供非阻塞的处理方式,也就是轮询。

前面文章学习了非阻塞访问设备时,应用程序可以调用的三个函数 select()函数,poll()函数,epoll()函数。文章地址如下:

Linux内核中处理非阻塞访问的方法:轮询-CSDN博客

Linux内核中轮询对应于应用层的函数之一:poll函数-CSDN博客

Linux内核中轮询对应于应用层的函数之一:epoll函数-CSDN博客

select()函数,poll()函数,epoll()函数。这三个函数对应了 Linux 驱动 file_operations 结构体中的成员函数 .poll的函数实现。

二.  Linux驱动下的poll操作函数

当应用程序调用 select poll 函数来对驱动设备进行非阻塞访问时,驱动程序 file_operations 操作集中的 poll 函数就会执行。
所以,驱动程序的编写者需要提供对应的 poll 函数, poll 函数原型定义在 file_operations结构体操作集中, poll 函数原型定义如下所示:
unsigned int (*poll) (struct file *filp, struct poll_table_struct *wait)
函数参数和返回值含义如下:
filp 要打开的设备文件 ( 文件描述符 )
wait 结构体 poll_table_struct 类型指针,由应用程序传递进来的。一般将此参数传递给
poll_wait 函数。
返回值 :向应用程序返回设备或者资源状态,可以返回的资源状态(这些宏定义在/usr/include/asm-generic/poll.h )如下:

POLLIN 有数据可以读取。
POLLPRI 有紧急的数据需要读取。
POLLOUT 可以写数据。
POLLERR 指定的文件描述符发生错误。
POLLHUP 指定的文件描述符挂起。
POLLNVAL 无效的请求。
POLLRDNORM 等同于 POLLIN,普通数据可读
POLLWRNORM 等同于 POLLOUT,可以写入数据

这里只列举出一部分常用的宏定义值,除此之外,还有其他宏定义返回值。

我们需要在驱动程序的 poll 函数中调用 poll_wait 函数, poll_wait 函数不会引起阻塞,只是将应用程序添加到 poll_table 中, poll_wait 函数原型如下:

void poll_wait(struct file * filp, wait_queue_head_t * wait_address, 
               poll_table *p)
参数 wait_address 是要添加到 poll_table 中的等待队列头。
参数 p 就是 poll_table ,就是 file_operations poll 函数的 wait 参数。

关于 Linux驱动下的poll操作函数介绍到这里,接下来就是通过实验来说明阻塞与非阻塞IO访问驱动设备。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值