如何从proc文件中读取大数据?

时间:2011-12-27 19:53:56

标签: linux module kernel procfs

我正在尝试编写一个将一些数据写入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 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

我确实遇到了这个问题。

原始帖子中的一个问题是if (offset>0)在小型proc文件的示例中多次使用。多次调用读取,直到我们返回0表示没有更多数据。所以if (offset>0)意味着我们返回(缓冲区的长度)为0。

使用此功能有3种方法可以返回数据。查看源代码注释line 75 onwards

对于大文件(评论中的方法2),我做了以下内容: -

  • 对于每个大数据块,将'buffer_length'数据复制到'buffer'。
  • 将'* start'(或在您的情况下为* buffer_location)设置为'buffer'。
  • 返回您编写的数据量(通常为“buffer_length”)

最后,所有数据都将被写入并返回0.

这对我来说有几个数据。