无法通过Linux内核模块中的/ proc文件系统读取链表

时间:2012-02-15 01:12:39

标签: c linux kernel kernel-module

我想通过/ proc文件系统读取内核模块创建的链表。我的用户空间程序将包含一个fopen()调用open / proc / file1 for read,并将使用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;
  }

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

任何人都可以帮忙。

谢谢。

1 个答案:

答案 0 :(得分:1)

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

这个函数将被内核一次又一次地调用,直到count达到0,这意味着要读取100个字节的数据。

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