0
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;

    }

ただし、初めてecho -n "HEllo" andを実行するとcat /dev/mynull、印刷のみoが行われ、何らかの理由でデバイスが解放されます。その後cat /dev/mynullは何も返されません。の値strlen(buffer)は1です。
なぜこれが発生するのですか?期待される結果は、Helloが出力され、strlen()を返す必要があるということ5です。

4

1 に答える 1

2

この行my_write

copy_from_user(buffer, buf+len-1, 1)

buf+len-1ユーザーアドレスからカーネルバッファに1文字をコピーします。これは、ユーザー文字列の最後の文字、つまり'o'。私はそれがすべきだと思います:

copy_from_user(buffer, buf, len);

その後:

buffer[len] = 0;

ユーザーバッファがNULで終了していない場合に備えて。

そのすべては価値を考慮に入れてoffいませんが、それはあなたが正確に何をしたいかに依存します(多分?にコピーしbuffer + *offます)。ところで、バッファのオーバーランなどもチェックする必要があります。

于 2012-12-07T12:26:45.450 に答える