kzs*_*kzs 2 c linux linux-device-driver linux-kernel
我通过echo:echo -nh/dev/mydriver将h写入驱动程序
当我做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;
}
Run Code Online (Sandbox Code Playgroud)
如果要在自定义驱动程序中使用标准工具(如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;
}
Run Code Online (Sandbox Code Playgroud)