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

6

我正在尝试编写一个内核模块,将一些数据写入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

我曾经也遇到过这个问题。

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

有三种方法可以使用此函数返回数据。请查看源代码注释,从第75行开始

对于大文件(评论中的第2种方法),我采用了以下方式:

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

最后,所有数据都将被写入并返回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内核源代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接