我编写了一个linux char设备驱动程序来模拟文件。数据存储在一个数组中,我想实现一个“读取文件” - 处理程序...
static ssize_t data_read(struct file *f, char __user *buf, size_t count, loff_t *f_pos){
char *msg_pointer;
int bytes_read = 0;
if(vault.storage==NULL)
return -EFAULT;
msg_pointer = vault.storage + *f_pos;
while (count && (*f_pos < vault.size) ) {
put_user(*(msg_pointer++), buf++);
count--;
bytes_read++;
++*f_pos;
}
return bytes_read;
}
vault.storage是指向kmalloc创建的指针。如果我通过使用dd复制来测试代码,它会按预期工作,但是当我想用C
打开文件时if((fp_data = open("/dev/vault0", O_RDWR)) < 0){
perror("could not open file.\n");
}
err = write(fp_data, "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", 36);
if (err < 0){
perror("failed to write to sv \n");
}
read(fp_data, buffer, 36);
read(fp_data, buffer, 36);
第一个读命令返回4 ..第二个0 - 这怎么可能?
答案 0 :(得分:3)
write
无法保证写入原子请求的所有字节...当请求的写入量小于PIPE_BUF
时,仅保留给管道或FIFO 。例如,写入一些字节后,write
可能被信号中断,并且在返回之前,write
将不会输出所请求的全部字节数。因此,您应该在将任何信息读回缓冲区之前测试写入的字节数,以确保您尝试读回写入的相同字节数。
答案 1 :(得分:0)
将printk放入data_read调用并打印计数并打印返回给用户的内容(检查bytes_read的值)。 bytes_read返回到使用空间中的read()调用。确保您返回正确的值。你也可以打印fpos并检查发生了什么。
这里我假设您的驱动程序读写函数被正确调用,我的意思是您的设备文件的主要和次要数字属于您的驱动程序