BIN_ATTR_RW(name,2*PAGE_SIZE) ,name_read(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t)参数size_t显示大小为PAGE_SIZE,是用户空间提供的buf大小,用户空间每次最多只copy PAGE_SIZE大小直到loff_t是2*PAGE_SIZE为止,那name_read函数怎么写才能保证大于PAGE_SIZE的数据都能cat出来,只用vsnprintf不用copy_to_use?
时间: 2024-02-27 13:53:13 浏览: 111
如果不使用`copy_to_user`函数,而是使用`vsnprintf`函数将数据格式化到用户空间提供的缓冲区中,那么可以按照如下方式实现`name_read`函数:
```
static ssize_t name_read(struct file *filp, struct kobject *kobj,
struct bin_attribute *attr, char *buf,
loff_t pos, size_t size)
{
ssize_t ret = 0;
char *tmp = NULL;
size_t len = 0;
/* allocate temporary buffer */
tmp = kmalloc(size + 1, GFP_KERNEL);
if (!tmp) {
return -ENOMEM;
}
/* read data from device */
ret = read_data_from_device(tmp, pos, size);
if (ret <= 0) {
goto out;
}
/* null-terminate temporary buffer */
tmp[ret] = '\0';
/* format data to user space buffer */
len = vsnprintf(buf, size, "%s", tmp);
if (len >= size) {
ret = -EINVAL;
goto out;
}
ret = len;
out:
kfree(tmp);
return ret;
}
```
在该函数中,首先使用`kmalloc`函数分配一个临时缓冲区`tmp`,大小为`size + 1`,其中`+1`是为了在缓冲区末尾添加一个`null`字符,以便后续使用`vsnprintf`函数对缓冲区进行格式化。然后使用`read_data_from_device`函数从设备中读取数据到临时缓冲区中。
接下来,使用`vsnprintf`函数将临时缓冲区中的数据格式化到`buf`缓冲区中。如果格式化后的数据长度大于等于`size`,则表示用户提供的缓冲区不足以容纳所有数据,返回`-EINVAL`错误。否则,返回格式化后的数据长度。
最后,释放临时缓冲区`tmp`并返回结果。
阅读全文