最近在看一些Linux相关的东西, 这个虚拟文件系统下的文件, 使用ls命令查看得到的大小为0, 使用代码编程得到的大小也为0. 我知道这不是真实存在于磁盘上的文件, 而是内核模块内存映射过来的虚拟文件, 但是应该也有方法可以得到它的大小把, 不然我每次获取它的信息, 准备缓冲区的话, 难道每次都要开辟足够大的缓冲区嘛?好像虚拟文件系统的限制好像是4096,(不知真假, 请各位大手子赐教). 我使用了C库和POSIX API均获得文件大小为0 。难道要使用内核API嘛?
#include
#include
#include
#include
// 获取文件大小,使用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
程序在终端下获得的文件大小一致。
可以在程序代码中, 根据虚拟文件的大小, 动态申请合适的内存空间来储存。
我的理解,你想要知道文件大小,是为了更好确定文件缓存的大小。。。。
但是,前提要先确定下,你读取文件的意义是什么?例如,读取/proc/cpuinfo 或者/proc/meminfo
当你需要读去cpuinfo 的时候,那么你需要使用这些信息,并且知道cpuinfo 中每一行的数据结构,并进行解析。。。。
一般,这些虚拟文件系统中的节点,都是十分熟悉其取值才会使用的。。。。
另外,这些文件的size 为0,是因为他们并不是文件,而有可能只是一些全局变量的拼凑,这就是虚拟文件系统的重点之处,通过源码就能清晰了解。。。。
希望能能帮到你。。。。