0

Linuxカーネルモジュールで次のコードを確認していました:

static int proc_read_kernel(char *buffer, char **start, off_t offset, int length,int *eof, void *data)
 {
   int len=0;
   struct mem_rw_t *mem= (struct mem_rw_t *)data;

   switch(mem->flag)
   {

上記のコードから、次のように長さチェックを持つ別の関数に切り替えます

static int func1(char *buffer, char **start, off_t offset, int length)
{
    printk ("The value for len is %d\n\r",len);
    printk ("The value for length is %d\n\r",length);

    if(len > length)
         goto list_finished;

上記のコードの出力は次のようになります。len が最後の値の長さよりも大きくなり、proc read が正しく機能していないようです。

The value for len is 0
The value for length is 3072
The value for len is 398
The value for length is 3072
The value for len is 796
The value for length is 3072
The value for len is 796
The value for length is 3072
The value for len is 1537
The value for length is 3072
The value for len is 1777
The value for length is 3072
The value for len is 1777
The value for length is 3072
The value for len is 2029
The value for length is 3072
The value for len is 2427
The value for length is 3072
The value for len is 3120
The value for length is 3072
<4>proc_file_read: Read count exceeded

上記のエラーを削除するための提案はありますか?

4

1 に答える 1

1

あなたのコメントが言っていることに基づいて、私はあなたが見ることを提案しますlinux/seq_file.h
エクスポートするAPIを使用すると、サイズに制限のない複数行の/procエントリを作成できます。
1行のデータを返す関数を提供する必要があります。この関数は、毎回新しいバッファーを使用して、I/Sによって繰り返し呼び出されます。各行が3Kを超えない場合(そして、超えた場合はひどく読めないでしょう)、それは問題ないはずです。

于 2012-04-09T09:54:33.363 に答える