在我的读取功能myread中,当我执行cat/driver/mydriver时,它会连续打印读取的数据。我只需要打印一次怎么做
我通过执行echo将h写入驱动程序: echo-nh/dev/mydriver 当我执行cat/dev/mydriver时,myread函数会连续打印h。我想打印一次。如何做到这一点在我的读取功能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,
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
)。