8.2.3设备驱动中的轮询编程

        非阻塞I/O的应用程序通常会使用poll()、select()甚至是epoll()系统调用进行设备的非阻塞访问。无论是哪一种系统调用对应的都是设备驱动中的poll()函数。

驱动中poll函数原型:

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

第一个参数是file结构体指针。
第二个参数为轮询表指针。

驱动中的poll函数通常需要完成两件事情:

        ① 将可能会引起设备文件状态变化的等待队列头,添加poll_table_struct中
        ② 返回一个操作码,表示是否能对设备进行非阻塞访问、写访问等

下面以书中P202的代码为例:

static unsigned int xxx_poll(struct file *filp, poll_table *wait)
{
    unsigned int mask = 0;
    struct xxx_dev *dev = filp->private_data; 
    
    ...
    poll_wait(filp, &dev->r_wait, wait);
    poll_wait(filp, &dev->w_wait, wait);

    if(...) {    /*数据可读*/
        mask |= POLLIN | POLLRDNORM;    /*返回数据可读标识码*/
    }

    if(...) {    /*数据可写*/
        mask |= POLLOUT | POLLWRNORM;     /*返回数据可写标识码*/
    }

    ...
    return mask;
}

        ① struct xxx_dev *dev = filp->private_data; 通过私有数据获取设备结构体指针
        ② poll_wait(filp, &dev->r_wait, wait);   
             poll_wait(filp, &dev->r_wait, wait); 完成第一件事将会引起设备文件状态变化的等待队列头添加到轮询表中
        ③ 如果可读,返回数据可读标识码。如果可写,返回数据可写标识码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值