最近有开发有个需求,需要根据系统中某一文件系统的总容量规模情况,进行弹性调节回收资源线程的启动时机。本人的环境是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看一下实际结果: