2011-12-27 14 views
5

私はいくつかのデータをprocファイルに書き込むカーネルモジュールを作成しようとしています。私は5000文字のようなものを書こうとしていますが、$> cat/proc/myentryと言うと1000文字しか読み込めません。procファイルから大きなデータを読み取るにはどうすればよいですか?

int procfile_read(char *buffer, char **buffer_location, off_t offset, int buffer_length, int *eof, void *data){ 
int ret; 
static char my_buffer[4096]; 

if (offset > 0) { 

    ret = 0; 
} else { 

    ret = sprintf(my_buffer, LARGE STRING HERE); 
} 

*buffer_location=my_buffer; 
return ret; 
} 

これは私のコードです。前もって感謝します。

答えて

2

です。オリジナルのポストで

1つの問題は、if (offset>0)は小さなprocのファイルの例で何度も使用されています。 readは、それ以上データがないことを示す0を返すまで、複数回呼び出されます。だから、if (offset>0)は、私たちがこの機能を使用してデータを返すために3つの方法があります0

として(バッファの長さ)を返すことを意味します。あなたの大規模データの各塊のために

  • 、へのデータのコピーを「BUFFER_LENGTH」 - :line 75 onwards、ソースコードのコメントを見てください:大きなファイル(コメント2)の方法については

    を、私は次のことをやりました'バッファ'。

  • '* start'(またはあなたの場合は* buffer_location)を 'buffer'に設定してください。
  • 復帰します(通常は「BUFFER_LENGTH」)を書いたデータの量

最後に、すべてのデータが書き込まれると、あなたはこれがデータのいくつかのメグと私のために働い0

を返します。

3

私はカーネルの専門家ではないけど、linux-3.1.6/fs/proc/task_mmu.cに、私は

seq_printf(m, 
      "VmPeak:\t%8lu kB\n" 
      "VmSize:\t%8lu kB\n" 
      "VmLck:\t%8lu kB\n" 
      "VmHWM:\t%8lu kB\n" 
      "VmRSS:\t%8lu kB\n" 
      "VmData:\t%8lu kB\n" 
      "VmStk:\t%8lu kB\n" 

のようないくつかのコードを参照してくださいので、これはあなたがseq_printfないsprintfを使用する場合がありますことを示唆している.... mstruct seq_file *ポインタです。

は、一般的なルールとして、あなたが拡張しているフリーソフトウェアのソースコードを研究することによって多くのことを学びます。あなたのケースでは、それは私がまさにこの問題を抱えていたLinuxのkernel source code

関連する問題