Как я могу прочитать большие данные из файла proc? - PullRequest
6 голосов
/ 27 декабря 2011

Я пытаюсь написать модуль ядра, который записывает некоторые данные в файл 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;
}

Это мой код. Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 05 февраля 2013

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

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

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

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

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

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

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

3 голосов
/ 28 декабря 2011

Я не эксперт по ядру, но в 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

...