Linux驱动程序之poll机制

来源:互联网 发布:快速幂算法求a的n次方 编辑:程序博客网 时间:2024/06/05 17:56

      使用非阻塞I/O的应用程序通常会使用select()和poll()系统调用查询是否可对设备进行无阻塞的访问,这两个系统调用最终又会引发设备驱动中的poll()函数被执行所以我们的问题就集中到了如何编写设备驱动中的poll()函数就可以了。先来看看设备驱动中的poll()函数原型:

unsigned int (*poll)(struct file *filp, struct poll_table *wait);

     

      这个函数要进行下面两项工作:首先,对可能引起设备文件状态变化的等待队列调用poll_wait(),将对应的等待队列头添加到poll_table.然后,返回表示是否能对设备进行无阻塞读写访问的掩码。

在上面提到了一个poll_wait()函数,它的原型:

void poll_wait(struct file *filp, wait_queue_head_t *queue, poll_table *wait);

     它的作用就是把当前进程添加到wait参数指定的等待列表(poll_table)中。需要注意的是这个函数是不会引起阻塞的。poll_table定义在“include/linux/poll.h, line 38“,具体如下:

<span style="font-size:14px;">typedef struct poll_table_struct {      poll_queue_proc qproc;      unsigned long key; } poll_table; </span>

      经过以上驱动程序的poll()函数应该返回设备资源的可获取状态:POLLIN, POLLOUT, POLLPRI, POLLERR, POLLNVAL等宏的位"或"结果。每个宏的含义都表示设备的一种状态,如:

常量说明POLLIN普通或优先级带数据可读POLLRDNORM普通数据可读POLLRDBAND优先级带数据可读POLLPRI高优先级数据可读POLLOUT普通数据可写POLLWRNORM普通数据可写POLLWRBAND优先级带数据可写POLLERR发生错误POLLHUP发生挂起POLLNVAL描述字不是一个打开的文件
0 0
原创粉丝点击