【问题标题】:In my read function myread it is continuously printing the read data when i do cat /driver/mydriver. I need to print only once how to do that在我的读取函数 myread 中,当我执行 cat /driver/mydriver 时,它会不断打印读取的数据。我只需要打印一次如何做到这一点
【发布时间】:2013-01-29 08:54:58
【问题描述】:

我通过 echo 将 h 写入驱动程序: echo -n h /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;
}

【问题讨论】:

  • 因为你没有任何“文件结束”的条件。
  • 好的。我不知道在哪里放置条件。请你指导我。
  • @JoachimPileborg 你在说 cat 的行为吗?如果没有找到 EOF,它会重新读取文件吗?
  • @Sibrajas cat 程序读取它的输入,直到它到达文件结尾。而且由于 OPs 设备从不这样做,cat 将永远持续下去。此外,cat 不会“重读”任何内容,OP 设备只是一遍又一遍地“读取”相同的字符。
  • @JoachimPileborg 我不明白这部分。 “一遍又一遍地“读取”同一个字符。”但 myread 只执行一次 copy_to_user 。抱歉,这是一个非常基本的问题。

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


【解决方案1】:

如果您想在自定义驱动程序中使用标准工具(例如 cat),请不要忘记正确设置偏移量 (*loff_t off)。您的 read 函数应如下所示:

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

【讨论】:

    【解决方案2】:

    您必须考虑您希望设备如何工作...您写入的内容是否可用于多个进程?还是应该在阅读后删除您所写的内容?

    后者当然更简单,可以通过在myread函数中清除变量m来简单实现。如果为零,则从myread 函数返回零。

    【讨论】:

    • 静态 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;否则如果 (m) 返回 1;否则返回 0;我可以这样做吗..
    • @zair 请不要在 cmets 中发布代码。我可以从你发布的代码中破译,你需要检查mfirst。此外,您应该初始化 m,以防有人在写入任何内容之前尝试读取它,并在成功读取时清除它(即当您返回 1 时)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多