6

procファイルにデータを書き込むカーネルモジュールを書き込もうとしています。5000文字のようなものを書き込もうとしていますが、$> cat / proc / myentryと言うと、1000文字しか読み取れません。

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

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

4

2 に答える 2

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カーネルのソースコードです

于 2011-12-27T20:36:50.873 に答える
3

私はまさにこの問題を抱えていました。

元の投稿の1つの問題は、if (offset>0)小さなprocファイルの例で何度も使用されています。データがもうないことを示す0が返されるまで、読み取りは複数回呼び出されます。つまり、if (offset>0)(バッファの長さ)を0として返すことを意味します。

この関数でデータを返す方法は3つあります。75行目以降のソースコードコメントを見てください。

大きなファイル(コメントからの方法2)の場合、私は次のことを行いました:-

  • 大きなデータの塊ごとに、データの「buffer_length」を「buffer」にコピーします。
  • '* start'(またはこの場合は* buffer_location)を'buffer'に設定します。
  • 書き込んだデータの量を返します(通常は「buffer_length」)

最後に、すべてのデータが書き込まれ、0が返されます。

これは、いくつかのメグのデータでうまくいきました。

于 2013-02-05T12:46:47.727 に答える