【问题标题】:Cannot read linked list via /proc file system in Linux kernel module无法通过 Linux 内核模块中的 /proc 文件系统读取链表
【发布时间】:2012-03-06 09:28:54
【问题描述】:

我想通过 /proc 文件系统读取内核模块创建的链表。我的用户空间程序将包含一个 fopen() 调用以打开 /proc/file1 进行读取,并将使用 while 循环执行 fread() 以在每个循环中从链表中读取一个节点。

用户空间程序包含:

 char buffer[100];
 FILE* fp = fopen("/proc/file1","r");
 while(fread(buffer,sizeof(char),100,fp)){
      printf("%s",buffer);
      // buffer is cleared before next iteration
 }
 fclose(fp);

内核模块创建一个链表,其中每个节点都有一个类型

 struct node{
     int data;
     struct node* next;
 }

链表起始节点地址存储在一个名为LIST的变量中。

我在内核模块中为 read_proc 编写了以下代码:

  int read_func(char *page,char **start,off_t off,int count,int *eof, void* data)
  {
        static struct node* ptr = NULL;
        static int flag = 0;
        int len;

        if(flag == 0){
               flag = 1;
               ptr = LIST;
        }

        if(ptr == NULL){
               // empty linked list or end of traversal
               *eof = 1;
               flag = 0;
               return 0;
        }

        if(ptr != NULL){
               len = sprintf(page, "%d", ptr->data);
               ptr = ptr->next;
        }
        return len;
  }

在执行用户空间程序时,当链表包含两个或多个节点时,只读取一个节点。

谁能帮忙。

谢谢。

【问题讨论】:

  • 您能否提供更多信息,例如/proc/file1 的十六进制转储?
  • 在您的用户代码 sn-p 中关于您的 printf 的小说明:除非读取缓冲区包含零(字符 '\0'),否则将在缓冲区后打印垃圾。从read 获取返回的大小并正确终止缓冲区。

标签: c linux kernel kernel-module


【解决方案1】:

您请求读取 100 个字节的数据,而在您的 read_func() 中返回的数据少于 100 个。正如我在您之前的帖子中所说, Unable to understand working of read_proc in Linux kernel module

这个函数会被内核反复调用,直到count达到0,即读取100字节的数据。

基本上你想要返回记录之类的数据,所以你需要在返回 read_func() 之前将 eof 设置为 1。注意 start 必须按照上一篇文章中的说明进行设置。

【讨论】:

    猜你喜欢
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2020-03-11
    • 2021-11-20
    相关资源
    最近更新 更多