Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在我的读取功能myread中,当我执行cat/driver/mydriver时,它会连续打印读取的数据。我只需要打印一次怎么做_C_Linux_Linux Kernel_Linux Device Driver - Fatal编程技术网

在我的读取功能myread中,当我执行cat/driver/mydriver时,它会连续打印读取的数据。我只需要打印一次怎么做

在我的读取功能myread中,当我执行cat/driver/mydriver时,它会连续打印读取的数据。我只需要打印一次怎么做,c,linux,linux-kernel,linux-device-driver,C,Linux,Linux Kernel,Linux Device Driver,我通过执行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,

我通过执行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;
}

您必须考虑您希望您的设备如何工作。。。您写入的内容是否可用于多个进程?或者你写的东西一旦被读取就应该被删除


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

如果要在自定义驱动程序中使用标准工具(如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;
}

因为你没有任何“文件结束”的条件。我不知道该把条件放在哪里。“你能给我引路吗?”约阿希姆皮勒堡你在这里说的是猫的行为吗?如果找不到EOF,它会重新读取文件吗?@Sibrajas
cat
程序会读取其输入,直到找到文件的结尾。而且由于OPs设备从来没有
cat
将永远持续。另外,
cat
不会“重新读取”任何内容,OPs设备只是一遍又一遍地“读取”相同的字符。@JoachimPileborg我不理解这部分。“”反复读取同一个字符。但是myread只向用户复制一次。如果这是一个非常基本的问题,很抱歉。静态ssize_t myread(struct file*f,char u user*buf,size_t len,loff_t*off){printk(KERN_INFO“Read()\n”);if(copy__to_user(buf,&m,1)!=0)返回-EFAULT;else if(m)返回1;else返回0;}我可以这样做吗?@zair请不要在注释中发布代码。我能从你发布的代码中破译出什么,你需要先检查
m
。此外,您应该初始化
m
,以防有人试图在写入任何内容之前读取它,并在成功读取时清除它(即当您返回
1
)。