static ssize_t my_read(struct file *f, char __user *buf, size_t
len, loff_t *off)
{
static int first=1;
printk(KERN_INFO "Driver: read()\n");
printk(KERN_INFO "Value of loff_t %ld",*off);
printk(KERN_INFO "Inside value of stringlength is %d",strlen(buffer));
if (copy_to_user(buf,buffer, 1) != 0)
return -EFAULT;
else
{
if(first<=strlen(buffer))
{
first=first+1;
printk(KERN_INFO "INside value of first is %d",first);
printk(KERN_INFO "Inside value of stringlength is %d",strlen(buffer));
return 1;
}
else
return 0;
}
}
static ssize_t my_write(struct file *f, const char __user *buf,
size_t len, loff_t *off)
{
printk(KERN_INFO "Driver: write()\n");
if (copy_from_user(buffer, buf+len-1, 1) != 0)
return -EFAULT;
else
return len;
}
然而,当我第一次回显-n“HEllo”和cat /dev/mynull
时,它只打印o
并因某种原因释放设备。后续cat /dev/mynull
不返回任何内容。 strlen(buffer)
的值为1.
为什么会这样?预期结果是打印Hello并且strlen()
应该返回5
。
答案 0 :(得分:2)
my_write
中的这一行:
copy_from_user(buffer, buf+len-1, 1)
将1个char从buf+len-1
用户地址复制到内核缓冲区。这是用户字符串的最后一个字符,即'o'
。我认为应该是:
copy_from_user(buffer, buf, len);
然后:
buffer[len] = 0;
以防用户缓冲区未终止NUL。
所有这些都没有考虑off
值,但这取决于你想要做什么(可能复制到buffer + *off
?)。
顺便说一句,你还应该检查缓冲区溢出等。