飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 1235|回复: 0

[求助] 求教关于虚拟文件系统获取文件大小的问题

[复制链接]
  • TA的每日心情
    开心
    2024-4-9 22:41
  • 签到天数: 72 天

    [LV.6]常住居民II

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

    [C] 纯文本查看 复制代码
    #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;
    }


    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表