感谢您查看这个问题。
我正在编写一个简单的杂项字符设备,具有读写操作。请继续阅读...
TEXT
当我这样做时,以下代码仅打印一次所需的文本
cat /dev/mydevice01
这是读取函数的代码。
static ssize_t my_read(struct file *file, char __user *buff, size_t count, loff_t *ppos)
{
char *print_str = TEXT;
if (*ppos != 0)
return 0;
if ((count < TEXT_LENGTH) || (copy_to_user(buff, print_str, TLF_ID_LENGTH)))
return -EINVAL;
*ppos += count;
return count;
}
TEXT
是使用定义的#define
,所以是TEXT_LENGTH
我觉得这段代码有点太复杂了,因此我尝试修改它。这是修改后的代码,但是不断打印所需的文本,直到我使用SIGINT
( Ctrl+C) 的过程:
static ssize_t my_read(struct file *file, char __user *buff, size_t count, loff_t *ppos)
{
char *print_str = TLF_ID;
if (copy_to_user(buff, print_str, TLF_ID_LENGTH))
return -EINVAL;
return count;
}
我是 Linux 内核编程新手。我想知道代码出了什么问题。如果可能的话,一行代码就可以实现相同的功能。提前致谢!
答案1
我自己弄清楚了,我将把答案留给其他正在寻找类似内容的人。
static ssize_t my_read(struct file *file, char __user *buff, size_t count, loff_t *ppos)
{
char *print_str = TEXT;
int len = TEXT_LENGTH;
return simple_read_from_buffer(buff, count, ppos, print_str, len);
}
这按预期工作。只是不要忘记包含这些模块。
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/miscdevice.h>
#include <linux/module.h>
谢谢大家的帮助:)。