【问题标题】:How can I read large data from proc file?如何从 proc 文件中读取大数据?
【发布时间】:2012-01-28 17:43:55
【问题描述】:

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

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

【问题讨论】:

    标签: linux module kernel procfs


    【解决方案1】:

    我确实遇到了这个问题。

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

    使用此函数返回数据的方式有 3 种。看源码cmets,line 75 onwards

    对于大文件(来自 cmets 的方法 2),我执行了以下操作:-

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

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

    这对我有用几兆数据。

    【讨论】:

      【解决方案2】:

      我不是内核专家,但在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 .... mstruct seq_file * 指针。

      一般来说,通过研究您正在扩展的免费软件源代码,您会学到很多东西。在你的情况下,它是 Linux kernel source code

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-06
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 1970-01-01
        • 1970-01-01
        • 2015-12-10
        • 2020-05-28
        相关资源
        最近更新 更多