卡文特 2022-07-31 18:31 采纳率: 33.3%
浏览 41

Linux/Unix下关于虚拟文件系统获取文件大小的问题

问题遇到的现象和发生背景

最近在看一些Linux相关的东西, 这个虚拟文件系统下的文件, 使用ls命令查看得到的大小为0, 使用代码编程得到的大小也为0. 我知道这不是真实存在于磁盘上的文件, 而是内核模块内存映射过来的虚拟文件, 但是应该也有方法可以得到它的大小把, 不然我每次获取它的信息, 准备缓冲区的话, 难道每次都要开辟足够大的缓冲区嘛?好像虚拟文件系统的限制好像是4096,(不知真假, 请各位大手子赐教). 我使用了C库和POSIX API均获得文件大小为0 。难道要使用内核API嘛?

问题相关代码
#include <stdio.h>
#include <sys/stat.h>
#include <sys/statvfs.h>
#include <sys/statfs.h>

// 获取文件大小,使用C标准库
long getFileSize(const char *fileName)
{
    FILE *fp = fopen(fileName, "r");
    fseek(fp, 0, SEEK_END);
    long size = ftell(fp);
    fclose(fp);
    return size;
}

// 获取文件大小,使用POSIX标准库函数
long getFileSizeByPosix(const char *fileName)
{
    struct stat st;
    stat(fileName, &st);
    return st.st_size;
}

// 获取虚拟文件系统的文件大小
long getVFSFileSize(const char *fileName)
{
    struct statfs stfs;
    statfs(fileName, &stfs);
    return stfs.f_bsize * stfs.f_blocks;
//    struct statvfs stvfs;
//    statvfs(fileName, &stvfs);
//    return stvfs.f_frsize * stvfs.f_blocks;
}


int main(int argc,char* argv[]){
    printf("%ld字节\r\n",getFileSize("/proc/cpuinfo"));
    printf("%ld字节\r\n",getFileSizeByPosix("/proc/cpuinfo"));
    printf("%ld字节\r\n",getVFSFileSize("/proc/cpuinfo"));
    return 0;
}
运行结果

均获得的大小为0, 与ls程序在终端下获得的文件大小一致。

想要达到的结果

可以在程序代码中, 根据虚拟文件的大小, 动态申请合适的内存空间来储存。

  • 写回答

1条回答 默认 最新

  • 私房菜 移动开发领域优质创作者 2022-08-01 09:29
    关注

    我的理解,你想要知道文件大小,是为了更好确定文件缓存的大小。。。。
    但是,前提要先确定下,你读取文件的意义是什么?例如,读取/proc/cpuinfo 或者/proc/meminfo
    当你需要读去cpuinfo 的时候,那么你需要使用这些信息,并且知道cpuinfo 中每一行的数据结构,并进行解析。。。。
    一般,这些虚拟文件系统中的节点,都是十分熟悉其取值才会使用的。。。。
    另外,这些文件的size 为0,是因为他们并不是文件,而有可能只是一些全局变量的拼凑,这就是虚拟文件系统的重点之处,通过源码就能清晰了解。。。。
    希望能能帮到你。。。。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月31日

悬赏问题

  • ¥15 r语言神经网络自变量重要性分析
  • ¥15 基于双目测规则物体尺寸
  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢