2012-02-15 14 views
2

/procファイルシステムを介してカーネルモジュールで作成されたリンクリストを読みたいと思います。私のユーザ空間プログラムは、読み込みのために/ proc/file1を開くためのfopen()呼び出しを含み、fread()を実行してループごとにリンクリストからノードを読み出すwhileループを使用します。Linuxカーネルモジュールの/ procファイルシステム経由でリンクリストを読むことができません

ユーザ空間のプログラムが含まれています

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

をリンクリストは、2つの以上のノードが含まれている場合、一つのノードのみが読み込まれます。

誰でも助けてください。

ありがとうございます。

+0

'/ proc/file1'の16進数のような情報を提供できますか? –

+0

あなたのユーザコードスニペットの 'printf'に関する小さなメモ:バッファの後ろにゴミを印刷する場合は、読み込みバッファにゼロ(文字 '' \ 0 '')が含まれていない限り。 'read'から返されたサイズを取得し、バッファを適切に終了します。 –

答えて

1

あなたはこの関数は再びカーネルによって呼び出されます Unable to understand working of read_proc in Linux kernel module

、私はあなたの以前の記事で述べたように、あなたが100未満に戻ってきている)(100バイトのデータを読み出すために要求すると、あなたのread_funcでいるとカウントが0に達するまで、それは100バイトのデータを読み取ることを意味します。

基本的には、レコードのようなデータを返したいので、read_func()を返す前にeofを1に設定する必要があります。前の記事の説明に従ってstartを設定する必要があります。

関連する問題