2012-02-15 7 views
2

Я хочу прочитать связанный список, созданный модулем ядра через файловую систему/proc. Моя программа пространства пользователя будет содержать вызов fopen() для открытия/proc/file1 для чтения и будет использовать цикл while для выполнения fread() для чтения узла из связанного списка в каждом цикле.Не удается прочитать связанный список через файловую систему/proc в модуле ядра Linux

Программа пользовательского пространства содержит:

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; 
} 

Связанный список начальный адрес узла хранится в переменной с именем СПИСОК.

Я написал следующий код для 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

Можете ли вы предоставить дополнительную информацию, например, hexdump '/ proc/file1'? –

+0

Небольшое примечание о вашей 'printf' в фрагменте кода пользователя: если буфер чтения не содержит нуль (символ' '\ 0''), если будет печатать мусор после буфера. Получите возвращаемый размер из 'read' и правильно завершите буфер. –

ответ

1

Вы запрашиваете прочитать 100 байт данных и в вашем read_func() вы возвращаете меньше чем 100. Как я говорил в предыдущем посте, Unable to understand working of read_proc in Linux kernel module

эта функция будет вызываться ядром снова и снова до тех пор, пока счет не достигнет 0, это означает, что нужно прочитать 100 байтов данных.

В принципе, вы хотите вернуть данные, подобные записи, поэтому вам нужно установить eof в 1, прежде чем вы вернете read_func(). Обратите внимание, что запуск должен быть установлен как описано в предыдущем сообщении.