为什么我的设备驱动程序不打印我输入的内容

时间:2012-12-07 12:13:28

标签: c linux linux-kernel linux-device-driver

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

1 个答案:

答案 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?)。 顺便说一句,你还应该检查缓冲区溢出等。