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

空扰寡人 提交于 2019-12-08 02:20:18

问题


I wrote h into driver by doing echo: echo -n h /dev/mydriver

When I do cat /dev/mydriver, myread function is printing h continuously. I wanted to print once. How to do that.

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

回答1:


If you want to use standard tools (such as cat) with your custom drivers, do not forget to set offset (*loff_t off) correctly. Your read function should look something like this:

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:


You have to think about how you want your device to work... Will what you write to it be available to multiple processes? Or should what you write be removed once it's been read?

The latter is of course easier, and can simple be implemented by clearing the variable m in the myread function. If it's zero, then return zero from the myread function.



来源:https://stackoverflow.com/questions/14578949/in-my-read-function-myread-it-is-continuously-printing-the-read-data-when-i-do-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!