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 回答