在驱动中实现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));