我怎样才能从proc文件读取大数据?

我试图编写一个内核模块,将一些数据写入proc文件。 我试图写的东西像5000个字符,但是当我说$>猫/ 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; } 

这是我的代码。 提前致谢。

我有这个问题。

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

用这个函数有3种方式返回数据。 查看源代码注释, 第75行 :

对于大型文件(方法2从评论),我做了以下:

  • 对于大数据的每个块,将数据的“buffer_length”复制到“buffer”。
  • 设置'*开始'(或在你的情况下* buffer_location)到'缓冲区'。
  • 返回你写的数据量(通常是'buffer_length')

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

这对我有好几兆的数据。

我不是内核专家,但在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 内核源代码