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;
}

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

4

2 回答 2

3

我正是这个问题。

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

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

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

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

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

这对我有用几兆数据。

于 2013-02-05T12:46:47.727 回答
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 not sprintf.... Them是一个 struct seq_file *指针。

作为一般规则,您将通过研究您正在扩展的自由软件源代码学到很多东西。在您的情况下,它是 Linux内核源代码

于 2011-12-27T20:36:50.873 回答