linux虚拟文件作为设备驱动程序

时间:2012-01-13 18:41:23

标签: c linux kernel driver device

我编写了一个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 - 这怎么可能?

2 个答案:

答案 0 :(得分:3)

对文件执行的

write无法保证写入原子请求的所有字节...当请求的写入量小于PIPE_BUF时,仅保留给管道或FIFO 。例如,写入一些字节后,write可能被信号中断,并且在返回之前,write将不会输出所请求的全部字节数。因此,您应该在将任何信息读回缓冲区之前测试写入的字节数,以确保您尝试读回写入的相同字节数。

答案 1 :(得分:0)

将printk放入data_read调用并打印计数并打印返回给用户的内容(检查bytes_read的值)。 bytes_read返回到使用空间中的read()调用。确保您返回正确的值。你也可以打印fpos并检查发生了什么。

这里我假设您的驱动程序读写函数被正确调用,我的意思是您的设备文件的主要和次要数字属于您的驱动程序