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

发布于 2024-12-22 20:24:07 字数 444 浏览 1 评论 0原文

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

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

I'm trying to write a kernel module which writes some data to a proc file. I'm trying to write something like 5000 characters but when I say $>cat /proc/myentry I can read only 1000 characters.

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

This is my code. Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

满天都是小星星 2024-12-29 20:24:07

我正是遇到这个问题。

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

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

对于大型文件(注释中的方法 2),我执行了以下操作:-

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

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

这对我来说适用于几兆数据。

I had exactly this problem.

One issue in the original post, the if (offset>0) is used many times in examples of small proc files. The read is called multiple times until we return a 0 to indicate that there is no more data. So the if (offset>0) means we return (length of the buffer) as 0.

There are 3 ways to return data with this function. Look at the source code comments, line 75 onwards :

For large files (method 2 from comments), I did the following :-

  • For each lump of your large data, copy 'buffer_length' of data to 'buffer'.
  • Set '*start' (or in your case *buffer_location) to 'buffer'.
  • return the amount of data you wrote (typically 'buffer_length')

Finally, all data will be written and you return 0.

This worked for me with several Meg of data.

牵你的手,一向走下去 2024-12-29 20:24:07

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

I am not a kernel expert, but in linux-3.1.6/fs/proc/task_mmu.c I see some code like

    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"

so this suggests that you might want to use seq_printf not sprintf .... The m is a
struct seq_file * pointer.

As a general rule, you'll learn a lot by studying the free software source code which you are extending. In your case, it is the Linux kernel source code

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文