在我的阅读功能myread中,当我执行cat/driver/mydriver时,它会不断打印读取的数据.我只需要打印一次如何做到这一点

kzs*_*kzs 2 c linux linux-device-driver linux-kernel

我通过echo:echo -nh/dev/mydriver将h写入驱动程序

当我做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;
}
Run Code Online (Sandbox Code Playgroud)

KBa*_*art 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;
}
Run Code Online (Sandbox Code Playgroud)