Манипуляции со строками в модуле ядра Linux - PullRequest
1 голос
/ 16 января 2011

Мне трудно манипулировать строками во время написания модуля для Linux.Моя проблема в том, что у меня есть массив int [10] с разными значениями.Мне нужно создать строку, чтобы иметь возможность отправить в буфер в процедуре my_read.Если мой массив {0,1,112,20,4,0,0,0,0,0}, то мой вывод должен быть:

0:(0)
1:-(1)
2:-------------------------------------------------------------------------------------------------------(112)
3:--------------------(20)
4:----(4)
5:(0)
6:(0)
7:(0)
8:(0)
9:(0)

, когда я пытаюсь поместить вышеупомянутые строки в char []некоторые массивы, как странные символы заканчиваются там

вот код

    int my_read (char *page, char **start, off_t off, int count, int *eof, void *data)
{
 int len;   
 if (off > 0){
  *eof =1;
  return 0;
 }
     /* get process tree */
 int task_dep=0;   /* depth of a task from INIT*/
 get_task_tree(&init_task,task_dep);

 char tmp[1024];

 char A[ProcPerDepth[0]],B[ProcPerDepth[1]],C[ProcPerDepth[2]],D[ProcPerDepth[3]],E[ProcPerDepth[4]],F[ProcPerDepth[5]],G[ProcPerDepth[6]],H[ProcPerDepth[7]],I[ProcPerDepth[8]],J[ProcPerDepth[9]];
 int i=0;
 for (i=0;i<1024;i++){ tmp[i]='\0';}

 memset(A, '\0', sizeof(A));memset(B, '\0', sizeof(B));memset(C, '\0', sizeof(C));
 memset(D, '\0', sizeof(D));memset(E, '\0', sizeof(E));memset(F, '\0', sizeof(F));
 memset(G, '\0', sizeof(G));memset(H, '\0', sizeof(H));memset(I, '\0', sizeof(I));memset(J, '\0', sizeof(J));
 printk("A:%s\nB:%s\nC:%s\nD:%s\nE:%s\nF:%s\nG:%s\nH:%s\nI:%s\nJ:%s\n",A,B,C,D,E,F,G,H,I,J);
 memset(A,'-',sizeof(A));
 memset(B,'-',sizeof(B));
 memset(C,'-',sizeof(C));
 memset(D,'-',sizeof(D));
 memset(E,'-',sizeof(E));
 memset(F,'-',sizeof(F));
 memset(G,'-',sizeof(G));
 memset(H,'-',sizeof(H));
 memset(I,'-',sizeof(I));
 memset(J,'-',sizeof(J));
 printk("A:%s\nB:%s\nC:%s\nD:%s\nE:%s\nF:%s\nG:%s\nH:%s\nI:%s\nJ:%\n",A,B,C,D,E,F,G,H,I,J);


 len = sprintf(page,"0:%s(%d)\n1:%s(%d)\n2:%s(%d)\n3:%s(%d)\n4:%s(%d)\n5:%s(%d)\n6:%s(%d)\n7:%s(%d)\n8:%s(%d)\n9:%s(%d)\n",A,ProcPerDepth[0],B,ProcPerDepth[1],C,ProcPerDepth[2],D,ProcPerDepth[3],E,ProcPerDepth[4],F,ProcPerDepth[5],G,ProcPerDepth[6],H,ProcPerDepth[7],I,ProcPerDepth[8],J,ProcPerDepth[9]);  

 return len;
}

это сработало с этим:

 char s[500];
 memset(s,'-',498); 

 for (i=len=0;i<10;++i){ 
      len+=sprintf(page+len,"%d:%.*s(%d)\n",i,ProcPerDepth[i],s,ProcPerDepth[i]); 
} 

Интересно, есть ли простой флагумножить строку char в sprintf.спасибо -

1 Ответ

2 голосов
/ 16 января 2011

Вот несколько вопросов:

  1. Вы полностью заполнили массивы A, B, C ... символами. Затем вы передаете их в процедуру ввода-вывода, которая ожидает строки с нулевым символом в конце. Поскольку ваши строки не заканчиваются нулем, printk() будет продолжать печатать все, что находится в памяти стека после вашего объекта, пока не найдет ноль по счастливой случайности.

  2. Многопоточные ядра, такие как Linux, имеют строгие и относительно небольшие ограничения на распределение стека. Все экземпляры в цепочке вызовов ядра должны соответствовать определенному размеру, иначе что-то будет перезаписано. Вы можете не получить никакого обнаружения этой ошибки, просто какой-то сбой в нисходящем направлении, поскольку повреждение памяти приводит к панике или клину. Размещение больших и переменных массивов в стеке ядра просто не очень хорошая идея .

  3. Если вы собираетесь написать массив tmp [] и правильно завершить его, нет никаких оснований также инициализировать его. Но если вы собираетесь инициализировать его, вы можете сделать это с помощью кода, сгенерированного компилятором, просто сказав: char tmp[1024] = { 0 }; (Частичная инициализация агрегата требует инициализации всего агрегата C99.) Аналогичное наблюдение применимо и к другим массивам .

  4. Как насчет того, чтобы избавиться от большинства этих массивов и большей части этого кода и просто сделать что-то вроде:


for(i = j = 0; i < n; ++i)
    j += sprintf(page + j, "...", ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...