2

echo を実行してドライバに h を書きました: echo -nh /dev/mydriver

cat /dev/mydriver を実行すると、myread 関数が連続して h を出力します。一度は印刷したい。どうやってするか。

static char m;

static ssize_t myread(struct file *f, char __user *buf, size_t len, loff_t *off)
{
    printk(KERN_INFO "Read()\n");
    if (copy_to_user(buf, &m, 1) != 0)
        return -EFAULT;
    else
        return 1;
}

static ssize_t my_write(struct file *f, const char __user *buf, size_t len, loff_t *off)
{
    printk(KERN_INFO "Write()\n");
    if (copy_from_user(&c, buf + len – 1, 1) != 0)
        return -EFAULT;
    else
        return len;
}
4

2 に答える 2

5

カスタム ドライバで標準ツール ( catなど) を使用する場合は、オフセット (*loff_t off ) を正しく設定することを忘れないでください。読み取り関数は次のようになります

static ssize_t myread(struct file *f, char __user *buf, size_t len, loff_t *off)
{
    printk(KERN_INFO "Read()\n");

    /* You have just a single char in your buffer, so only 0 offset is valid */
    if(*off > 0)
        return 0; /* End of file */

    if (copy_to_user(buf, &m, 1))
        return -EFAULT;

    *off++;
    return 1;
}
于 2013-01-29T12:46:29.317 に答える
1

デバイスをどのように動作させたいかを考える必要があります...デバイスに書き込む内容は、複数のプロセスで利用できますか? それとも、あなたが書いたものは読まれたら削除されるべきですか?

m後者はもちろん簡単で、関数内の変数をクリアすることで簡単に実装できmyreadます。ゼロの場合は、関数からゼロを返しますmyread

于 2013-01-29T09:05:40.093 に答える