驱动程序编程:cat命令不显示输出

时间:2015-02-14 04:51:12

标签: linux kernel linux-device-driver

我是驱动程序编程的新手,我编写了一个简单的char设备驱动程序代码。当我在不使用指针的情况下编写它时,它崩溃了。

使用echo写入驱动程序时,它可以正常工作。但是当从中读取时,没有输出。有人请帮忙。文件操作部分代码如下所示。 'p'和'q'是正常的字符指针。 'max'值设置为10.'ptr'是静态int类型,初始化为'0'。

int my_open(struct inode *inode,struct file *filp)
{
printk("In open.\n");
if((filp->f_flags & O_ACCMODE) == O_WRONLY){
    p = (char *)buffer;
    ptr = 0;
    }
else if((filp->f_flags & O_ACCMODE) == O_RDONLY)
    q = (char *)buffer;

return 0;
}

int my_close(struct inode *inode,struct file *filp)
{
printk("In close.\n");
return 0;
}

ssize_t my_read(struct file *filp,char *buff,size_t count,loff_t *pos)
{
long ret;
printk("In read.\n");
ret = copy_to_user(buff,q,max);
q += max;
*pos += max;

if(ptr -= max)
    return max;
else
    return 0;
}

ssize_t my_write(struct file *filp,const char *buff,size_t count,loff_t *pos)
{
long ret;
printk("In write.\n");
ret = copy_from_user(p,buff,max);
p += max;
*pos += max;
ptr += max;
return max;
}

module_init(my_init);
module_exit(my_exit);

1 个答案:

答案 0 :(得分:1)

在读取和写入时,您没有考虑“count”参数,因为您的代码似乎假设“count> = max”,这是不能保证的。这本身可能会导致执行读取过程中出现任何问题。另外,在检查当前读取或写入位置是否超过缓冲区限制之前,先复制copy_to / from_user。此外,赋值/测试if (ptr -= max)仅在ptr完全等于max时有效,也不保证您多次执行读取。

注意:由于缺少p,q,buffer,ptr和max的定义,我假设它们看起来像:

static char *p;
static char *q;
statint int ptr = 0;
static char buffer[10];
static int max=10;