【发布时间】: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