我正在编写一个用户空间进程,它将连续从configfs条目中读取数据。我已经为内核中的读取定义了回调函数。 当我在循环中调用read时,仅在第一次调用回调时,对于下一次迭代,控件不会响应回调。
read的内核回调函数是返回字符的简单函数。
static ssize_t show(struct config_item *item, char *page)
{
static char a = 'a';
printk("reading data\n");
page[0] = a++;
return 1;
}
用户空间进程将读取数据并将其显示在屏幕上。
int main()
{
int fd = open("/sys/kernel/config/sample/showme", O_RDONLY);
int ret;
int i = 5;
char receive[8];
if (fd < 0) {
perror("Failed to open the device...");
return errno;
}
while(i--) {
ret = read(fd, receive, 1);
if (ret < 0) {
perror("Failed to read the message\n");
return errno;
}
printf("Message is %x with size %d\n", receive[0], ret);
}
close(fd);
}
输出:
消息为61,大小为1
消息为61,大小为0
消息为61,大小为0
消息为61,大小为0
消息为61,大小为0
注意:如果我关闭并打开文件进行所有读取,流程顺利。
如何解决上述问题?我希望数据能够反映在所有读数上。
答案 0 :(得分:2)
configfs 文件系统下的文件被解释为属性,它随时都有特定的有限内容。
例如,文件可能包含以下内容:
等等。
此外,configfs文件系统确保在打开文件后,用户执行的任何read()
都会看到部分数据一致与其他read()
。假设上面的例子,用户将不会读取第一个符号“1”(如在1ns时),第二个符号“b”(如在2ns时),然后发现3d符号不存在(如在3ns时)。
因此,在打开文件后,.show()
方法被调用一次,并且应该返回该文件的整个内容。该内容(或其中的适当部分)在用户的更多read
请求时返回。
关闭文件时会清除一致性保证;因此,当您再次打开它时,将再次调用.show()
,并且用户的read
请求将返回该文件的更新内容。
我正在编写一个用户空间进程,它将连续从configfs条目中读取数据。
由于有限文件的语义抽象内容丢失,因此无法为configfs文件实现。
但是,您可以使用任何“常规”文件系统实现此语义,该文件系统允许直接设置file_operations
回调。您可以创建一个文件,例如在 debugfs (/sys/kernel/debug/
)下:
ssize_t my_read (struct file * filp, char __user * buf, size_t size, loff_t * offp)
{
static char a = 'a';
printk("reading data\n");
a++;
copy_to_user(buf, &a, 1);
return 1;
}
struct file_operations my_ops = {
.owner = THIS_MODULE,
.read = &my_read
};
int module_init(void)
{
debugfs_create_file("showme", S_IRUGO, NULL, NULL, &my_ops);
...
}