最近有開發有個需求,需要根據系統中某一文件系統的總容量規模情況,進行彈性調節回收資源線程的啟動時機。本人的環境是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看一下實際結果: