一. 简介
如果用户应用程序以非阻塞的方式访问设备,设备驱动程序就要提供非阻塞的处理方式,也就是轮询。
前面文章学习了非阻塞访问设备时,应用程序可以调用的三个函数 select()函数,poll()函数,epoll()函数。文章地址如下:
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访问驱动设备。