我已经写入了一个读取函数来在内核空间中将文件读入缓冲区。第二次读取内核会覆盖第一个实例
int readfile(const char *filename, void *buf, int len, int offset)
{
struct file *filp;
mm_segment_t oldfs;
int bytes;
filp = NULL;
filp = filp_open(filename, O_RDONLY, 0);
if(!filp || IS_ERR(filp)) {
printk(" Error in reading file %s. Error = %d\n", filename, \
(int) PTR_ERR(filp));
return -1;
}
filp->f_pos = offset;
oldfs = get_fs();
set_fs(get_ds());
bytes = vfs_read(filp, buf, len, &filp->f_pos);
set_fs(oldfs);
filp_close(filp, NULL);
return bytes;
}
现在,这个功能确实很好,我能够读取文件名保存到buf的内容从我的系统调用
char *firstbuffer;
firstbuffer = kmalloc(sizeof(PAGE_SIZE), GFP_KERNEL);
bytesread = readfile(firstfile, firstbuffer, len, 0);
// Null terminate read string
firstbuffer[bytesread] = '\0';
printk("first buffer = %s\n",firstbuffer);
然后调用这个函数,我再次调用此函数读取secondfile的内容转换为第二缓冲区。
char *secondbuffer;
secondbuffer = kmalloc(sizeof(PAGE_SIZE), GFP_KERNEL);
bytesread2 = readfile(secondfile, secondbuffer, len, 0);
// Null terminate read string
secondbuffer[bytesread2] = '\0';
printk("second buffer %s", secondbuffer);
的问题是,呼吁secondfile读功能之后,我firstbuffer的内容越来越与secondbuffer的内容覆盖。
例如:如果firstfile的内容是
A
B
C
和secondfile的内容是
X
Y
Z
然后第一读取文件调用后,firstbuffer的含量为:
A
B
C
然后在第二次读文件调用后,firstbuffer的内容是:
A
X
Y
Z
现在,我不确定这里出了什么问题,但是在第二次读取函数调用后,firstbuffer的内容与第二缓冲区的内容合并。我该如何解决?
免责声明:
我知道我们不应该做的文件I/O在内核空间。这纯粹是为了学习读取函数如何在内核空间中工作。
你可以打印'firstbuffer'和'secondbuffer'的值吗?例如,'printf(“1:%p \ n2:%p \ n”,firstbuffer,secondbuffer);' – jxh
@jxh:是的,我可以打印它们的值。使用printk(“%s \ n,firstbuffer)和printk(”%s \ n,secondbuffer)来做到这一点 – Piyush
@JohnKugelman:完成。增加了mcv的例子。 – Piyush