Невозможно прочитать связанный список через файловую систему / proc в модуле ядра Linux - PullRequest
2 голосов
/ 15 февраля 2012

Я хочу прочитать связанный список, созданный модулем ядра через файловую систему / 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;
  }

При выполнении программы пространства пользователя читается только один узел, когда связанный список содержит два или более узлов.

Может кто-нибудь помочь, пожалуйста.

Спасибо.

1 Ответ

1 голос
/ 15 февраля 2012

Вы запрашиваете чтение 100 байт данных, и в вашем read_func () вы возвращаете меньше 100. Как я уже говорил в вашем предыдущем посте, Невозможно понять работу read_proc в модуле ядра Linux

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

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

...