2011-12-27 7 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

У меня была именно эта проблема.

Одна проблема в исходном посте, if (offset>0) используется много раз в примерах небольших файлов proc. Чтение вызывается несколько раз, пока мы не вернем 0, чтобы указать, что данных больше нет. Таким образом, if (offset>0) означает, что мы возвращаем (длина буфера) равным 0.

Существует 3 способа возврата данных с помощью этой функции. Посмотрите на комментарии исходного кода, line 75 onwards:

Для больших файлов (метод 2 от комментариев), я сделал следующее: -

  • Для каждого комка ваших больших объемов данных, копирования «buffer_length» данных в «буфер».
  • Установите '* start' (или в вашем случае * buffer_location) в 'buffer'.
  • возвращает количество данных, которые вы написали (обычно «buffer_length»)

Наконец, все данные будут записаны и вы вернетесь 0.

Это работает для меня с несколькими Meg данных.

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 .... m является struct seq_file * указатель.

Как правило, вы узнаете много, изучая исходный код бесплатного программного обеспечения, который вы распространяете. В вашем случае это Linux kernel source code