读取configfs文件

时间:2017-12-08 12:50:14

标签: file linux-kernel config

我正在编写一个用户空间进程,它将连续从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

注意:如果我关闭并打开文件进行所有读取,流程顺利。

如何解决上述问题?我希望数据能够反映在所有读数上。

1 个答案:

答案 0 :(得分:2)

configfs 文件系统下的文件被解释为属性,它随时都有特定的有限内容。

例如,文件可能包含以下内容:

  • “123”at moment 1ns
  • “abc”at moment 2ns
  • “”(空)时刻3ns

等等。

此外,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);
    ...
}