我想通过/ 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;
}
在执行用户空间程序时,当链表包含两个或更多节点时,只读取一个节点。
任何人都可以帮忙。
谢谢。
答案 0 :(得分:1)
您正在请求读取100个字节的数据,而在read_func()中,您返回的数据少于100.正如我在您之前的帖子中所述, Unable to understand working of read_proc in Linux kernel module
这个函数将被内核一次又一次地调用,直到count达到0,这意味着要读取100个字节的数据。
基本上你想要返回像记录一样的数据,所以你需要在返回read_func()之前将eof设置为1.请注意,必须按照上一篇文章中的说明设置start。