【问题标题】:how to read last n bytes from a proc file in C如何从C中的proc文件中读取最后n个字节
【发布时间】:2014-09-27 00:16:17
【问题描述】:

我想读取 proc 文件 /proc//status 的最后 n 个字节。

在常规文件上,我可以从文件末尾开始 fseek,例如:

fseek(proc_file, -BUF_SIZE, SEEK_END);

但由于 proc 文件的大小为零,所以这不起作用。

关于如何从最后阅读的任何建议?

我肯定希望避免循环到最后。

【问题讨论】:

    标签: c file proc procfs


    【解决方案1】:

    状态文件很小。只需 fread 前 10000 个字节:

    int fileLen = fread( statusFile, buffer, 10000 );
    

    fread 将返回文件中的字节数以及文件的内容。然后您可以检查文件的结尾。

    只读取最后几个字节没有任何好处。文件 i/o 系统是缓冲的,因此即使请求几个字节也会导致较低层读取几个 k。

    【讨论】:

    • 我敢打赌 1024 字节应该足够了。我在我的系统上做了for file in $(ls -1 /proc | egrep '^[0-9]+$'); do wc -c /proc/$file/status 2> /dev/null; done | sort -n,最小值是 532,而最大值是 850。也许保守的一面会犯错,做 4096。
    • WRT 缓冲:这适用于普通文件系统,但不是适用于 procfs。它不受块设备的支持,因此没有缓存。读操作由内核直接完成。
    • @Mike 我已经看到它在集群上超过了 1k,但是是的,我最终也使用了 4k。
    • @duskwuff:是也不是。我知道 procfs 不是块设备,也不做那种缓存。但我认为对于 /proc 中的这些假内核空间文件,“文件”实际上并不存在 - 而是内核空间二进制数据结构 - 非文本。在打开或读取时,结构被序列化到缓冲区。只读取它的一部分仍然会导致生成内核空间中的整个缓冲区。
    猜你喜欢
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 2018-06-06
    相关资源
    最近更新 更多