statvfs構造体プロファイリング


テスト中、f_bfreeの値比f_frsizeの値が10%より大きいサイズは、16 Gのディスクを意味します.
f_bfreeテストの結果は17 G,f_frsizeテストの結果は15 G
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 */
};
テスト環境:ext 4
1)解析f_bsizeとf_frsizeの異同
ブロックあたりのバイト数
印刷結果は4096バイトで、明らかに同じです.
2)分析f_bfreeとf_bavail
ディスクの空き容量を示す
印刷結果は
ディスクが16 Gの場合、f_bfree比f_Bavail大809 MB
ディスクが1.5 Tの場合、f_bfree比f_Bavail大2585 MB
私たちが想像していたような線形成長はありません
実際に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
",pszDevicePath,pszDeviceMountPoint); } } endmntent(pFile); return0; } // statvfs intGetDeviceRoomSize(constchar*pszDeviceMountPoint) { structstatvfsbuf; intrv=statvfs(pszDeviceMountPoint,&buf); if(!rv) { printf("wholespace:%uMbytes
",(buf.f_blocks*buf.f_frsize)/1024/1024); printf("availspace:%uMbytes
",(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
",nDiskRoomSize); return0; }