linux驱动中实现上层select接口

在驱动中实现file_operations结构的poll方法后,上层应用可以通过select或者poll方法来查询设备是否有数据可以读写。本文记录驱动中实现上层select查询设备是否有数据可以读取的方法。

1、实现file_operation

实现file_operation结构体中的相关打开、关闭、查询和读取方法,在上层调用select接口时会调用poll方法,该方法完成如下动作:

① 在一个或多个可指示查询状态变化的等待队列上调用 poll_wait. 如果没有文件描述符可用来执行 I/O, 则内核使进程在传递到该系统调用的所有文件描述符对应的等待队列上等待。
 返回一个用来描述操作是否可以立即无阻塞执行的位掩码。

如:

int landsem_is_shakeup_open(struct inode *inode, struct file *filp)  {
    return 0;
}

static ssize_t landsem_is_shakeup_read(struct file *filp, char __user *buffer, size_t size, loff_t *off)
{
    size_t rel_size = 0;
    
    ls_dev_dbg("call %s.\n",__func__);   
    return rel_size;    
}

static unsigned int landsem_is_shakeup_poll(struct file *filp, struct poll_table_struct *wait)
{
    unsigned int mask = 0;

    poll_wait(filp, &event_wait, wait);
    //set mask
    if(/*数据可读条件*/)  {
        mask |= POLLIN | POLLRDNORM;
    }
    
    return mask;
}

int landsem_is_shakeup_close(struct inode *inode, struct file *filp)  {

    return 0;
}

static struct file_operations fops_is_shakeup = {
	.open = landsem_is_shakeup_open,
	.read = landsem_is_shakeup_read,
	.poll = landsem_is_shakeup_poll,
	.release = landsem_is_shakeup_close,
};

2、在有数据可以供读取时唤醒等待队列

在有数据可以读时如中断底部处理代码中更新poll的判别条件并唤醒等待队列,唤醒时用如下方法:

wake_up_interruptible(&(event_wait));		



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值