Linux 使用statvfs读取文件系统信息

本文转载自:https://blog.csdn.net/papiping/article/details/6980573

在测试过程中,f_bfree的值比f_frsize的值大于10%的尺寸大小,意味着16G的磁盘

f_bfree测试出来的结果是17G,f_frsize测试的结果是15G

 

struct statvfs {

   unsigned long  f_bsize;    /* file system block size */文件系统块大小

   unsigned long  f_frsize;   /* fragment size */碎片大小

   fsblkcnt_t     f_blocks;   /* size of fs in f_frsize units */

   fsblkcnt_t     f_bfree;    /* # free blocks */空闲的块

   fsblkcnt_t     f_bavail;   /* # free blocks for unprivileged users */用户级的空闲节点

   fsfilcnt_t     f_files;    /* # inodes */节点

   fsfilcnt_t     f_ffree;    /* # free inodes */空闲的节点

   fsfilcnt_t     f_favail;   /* # free inodes for unprivileged users */用户级的空闲节点

   unsigned long  f_fsid;     /* file system ID */

   unsigned long  f_flag;     /* mount flags */

   unsigned long  f_namemax;  /* maximum filename length */

 

};

测试环境:ext4

1)分析f_bsize和f_frsize的异同

表示每块包含字节的多少

打印结果都是4096字节,显然都是一样的

2)分析f_bfree和f_bavail

表示磁盘剩余空闲的容量

打印结果是

磁盘为16G的情况下,f_bfree比f_bavail大809MB

磁盘为1.5T的情况下,f_bfree比f_bavail大2585MB

并没有我们想象的成线性增长

实际情况下采用df -Th

f_bavail更加接近显示的值

3)f_blocks表示磁盘的整体空间

4)计算磁盘各个方面的数值如下:

磁盘的整体空间:(buf.f_blocks *  buf.f_frsize)/1024/1024)MB

磁盘的空闲空间:(buf.f_bfree *  buf.f_frsize)/1024/1024)MB

磁盘的用户级空闲空间:(buf.f_bavail *  buf.f_frsize)/1024/1024)MB

 

 

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<mntent.h>

#include<sys/statvfs.h>

 

 

//pszDevicePath是设备的文件描述符,pszDeviceMountPoint是设备的挂载点

intGetDeviceMountPoint(constchar*pszDevicePath,char*pszDeviceMountPoint)

{

structmntent*pent;

FILE*pFile;

 

pFile=setmntent("/proc/mounts","r");

if(pFile==NULL){

perror("setmntent");

return-1;

}

while(NULL!=(pent=getmntent(pFile)))

{

if(strcmp(pent->mnt_fsname,pszDevicePath)==0)

{

sprintf(pszDeviceMountPoint,"%s",pent->mnt_dir);

printf("Device:%smountpointis:%s\n",pszDevicePath,pszDeviceMountPoint);

}

}

endmntent(pFile);

return0;

}

//通过statvfs查询挂载点上文件系统的空间大小

intGetDeviceRoomSize(constchar*pszDeviceMountPoint)

{

structstatvfsbuf;

intrv=statvfs(pszDeviceMountPoint,&buf);

 

if(!rv)

{

printf("wholespace:%uMbytes\n",(buf.f_blocks*buf.f_frsize)/1024/1024);

printf("availspace:%uMbytes\n",(buf.f_bavail*buf.f_frsize)/1024/1024);

 

}

else

{

perror("statvfs");

return-1;

}

return(buf.f_blocks*buf.f_frsize)/1024/1024;

}

 

intmain(intargc,char*argv[])

{

intnDiskRoomSize=0;

charszMountPoint[32]={0};

GetDeviceMountPoint(argv[1],szMountPoint);

nDiskRoomSize=GetDeviceRoomSize(szMountPoint);

printf("DiskRoomSize=%dMB\n",nDiskRoomSize);

return 0;

}

posted @ 2018-12-13 16:12  请给我倒杯茶  阅读(4688)  评论(0编辑  收藏  举报