0

私は、ユーザーからいくつかのエントリを取得し、それらをより小さな文字列に分割して配列に格納するモジュールを作成しています。ロジックは正常に機能していますが、数分後にカーネルパニックが発生します。以下では、ユーザースペースから/ procファイルにエントリを配置し、モジュールにコーディングするためのコードを示しています。

FILE *fp;
fp =fopen("/proc/tx_info","w");

fprintf(fp,"protocol   address      tos   payload interface");
fprintf(fp,"\n %3s %6s %7d %5d %6s\n",prot,addr,tos,pld,inter);
fclose(fp);

モジュール内のコード

void tx_break(void)
{
char ch;
char tmp[25];
int i =0;
int k=0,j=0,y = 0;

ch = tx_buffer[0];
//runing the while loop while the ch goes to next line from where the real user entries starts
while(ch != '\n')
     {
       ch = tx_buffer[i];
       i++;
     }


while(ch != '\0')
{
   j=0;
//while loop for blanks in between the user entries
   while(ch == ' ' && ch != '\0')
    {
      i++;
      ch = tx_buffer[i];
    }
//while loop to put the user defined entries to a temporary tmp which would become an entry of 2d array(info.arr[][])
  while(ch != ' ' && ch !='\0')
    {
       tmp[j] = ch;
       j++;
       i++;
       ch = tx_buffer[i];
    }
    tmp[j] = '\0';
    printk(KERN_ALERT"\n%s\n",tmp);
//putting user entries to an 2d array
    for(k=0;tmp[k] != '\0';k++)
         info.arr[y][k] = tmp[k];
         info.arr[y][k] = '\0';
    printk("the 2d::%s",&info.arr[y][0]);
    y++;
   // memcpy(&info.arr[k][0],tmp,j+1);
   // k++;
}
 }
4

1 に答える 1

0

どうやって読んでいるのかよくわからないtx_bufferpので、ファイルからすべての情報を保存していると思い/proc/tx_infoます。

ここから、いくつかの間違いがあります。

while(ch != '\n')
{
    ch = tx_buffer[i];
    i++;
}

最後の実行時にch='\n'を維持します。

ここで、ch ='\ n' 、、tmp[0] = "\n"を使用して、それをに格納し、info.arr[0]そのアドレスを出力します。したがって、に1つの非アイテムを保存しましたinfo.arr。この変数の次元はどれですか?多分あなたは範囲外に保管しています。

最後のアイテム処理では、\n文字も格納してtmpいるためwhile(ch != ' ' && ch !='\0')です。これは正しいです?

于 2012-04-09T10:26:52.090 に答える