最近有开发有个需求,需要根据系统中某一文件系统的总容量规模情况,进行弹性调节回收资源线程的启动时机。本人的环境是linux,并且需要用c语言进行处理。
网上查找资料发现内核函数statfs可以完成这个任务,下面就结合网上的一些资料和书上的一些信息,简单介绍一下这个函数和它的使用方法。
1. 函数的声明如下:
int statfs(const char path,struct statfs buf);
(1) 入参:
path:位于需要查询信息的文件系统的文件的路径;
buf: statfs结构体类型的指针变量,用于存储文件系统的相关信息。
(2)statfs结构体:
1 struct statfs{ 2 long f_type; //文件系统的类型 3 long f_bsize; //经优化后的传输块的大小 4 long f_blocks; //文件系统数据块总数 5 long f_bfree; //可用块数 6 long f_bavail; //普通用户能够获得的块数 7 long f_files; //文件结点总数 8 long f_ffree; //可用文件结点数 9 fisd_t f_fsid; //文件系统标识 10 long f_namelen; //文件名的最大长度 11 }
(3)注意点
这个函数在<sys/statfs.h>头文件中包含着,所以编码时需要引用进去。
2. 编写简单测试用例
动手的机会来了,简单的测试代码如下:
1 #include <sys/statfs.h> 2 #include <stdio.h> 3 4 int main(int argc,char **argv) 5 { 6 struct statfs diskInfo; 7 8 /* 1.获取/home/下面的总容量 */ 9 statfs("/home/", &diskInfo); 10 unsigned long long blocksize = diskInfo.f_bsize; //每个block里包含的字节数 11 unsigned long long totalsize = blocksize * diskInfo.f_blocks;//总的字节数,f_blocks为block的数目 12 printf("Total_size=%llu B =%llu KB =%llu MB = %llu GB\n", 13 totalsize,totalsize>>10,totalsize>>20, totalsize>>30); 14 15 /* 2.获取一下剩余空间和可用空间的大小 */ 16 unsigned long long freeDisk = diskInfo.f_bfree * blocksize; //剩余空间的大小 17 unsigned long long availableDisk = diskInfo.f_bavail * blocksize; //可用空间大小 18 printf("Disk_free=%llu MB =%llu GB Disk_available=%llu MB = %llu GB\n", 19 freeDisk>>20,freeDisk>>30,availableDisk>>20, availableDisk>>30); 20 21 return 0; 22 }
结果如下:
然后df -h看一下实际结果: