驱动程序编程:cat 命令不显示输出
Driver programming : cat command not showing output
我是驱动编程新手,写了一个简单的字符设备驱动代码。当我在不使用指针的情况下编写它时,它崩溃了。
当使用 echo 写入驱动程序时,它可以工作。但是从中读取时,没有输出。有人请帮忙。文件操作部分代码如下所示。 'p' 和 'q' 是普通字符指针。 'max' value was set as 10. 'ptr' 是 static 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);
在读取和写入中,您都没有考虑 "count" 参数,因为您的代码似乎假定 "count>=max",这是无法保证的。这本身可能会在执行读取的过程中导致任何类型的麻烦。此外,您 copy_to/from_user 在检查当前读取或写入位置是否超过缓冲区限制之前。此外,assignment/test 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;
我是驱动编程新手,写了一个简单的字符设备驱动代码。当我在不使用指针的情况下编写它时,它崩溃了。
当使用 echo 写入驱动程序时,它可以工作。但是从中读取时,没有输出。有人请帮忙。文件操作部分代码如下所示。 'p' 和 'q' 是普通字符指针。 'max' value was set as 10. 'ptr' 是 static 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);
在读取和写入中,您都没有考虑 "count" 参数,因为您的代码似乎假定 "count>=max",这是无法保证的。这本身可能会在执行读取的过程中导致任何类型的麻烦。此外,您 copy_to/from_user 在检查当前读取或写入位置是否超过缓冲区限制之前。此外,assignment/test 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;