一、前言html
在嵌入式設備中,硬盤空間很是有限,在涉及到常常寫日誌的進程時候,須要考慮日誌的大小和刪除,否則很快就硬盤寫滿,致使日誌程序崩潰。爲了捕獲硬盤寫滿的異常場景,咱們須要在寫日誌過程當中判斷硬盤空間的使用狀況,根據硬盤的使用狀況,就能夠判斷是否寫滿了。若是將要寫滿了,就給出警告。這樣就能夠避免程序崩潰。首先看一下linux獲取硬盤和目錄大小的命令,最後總結一下statfs結構和函數。node
二、df命令linux
Linux下能夠用df命令獲取硬盤的使用狀況,經過man能夠獲取df命令的詳細狀況。df命令常常用的參數爲:函數
a:顯示所有的檔案系統和各分割區的磁盤使用情形
i:顯示i -nodes的使用量
k:大小用k來表示 (默認值)
t:顯示某一個檔案系統的全部分割區磁盤使用量
x:顯示不是某一個檔案系統的全部分割區磁盤使用量
T:顯示每一個分割區所屬的檔案系統名稱
經常使用命令:df -hi 學習
舉例截圖以下所示測試
:優化
三、du命令spa
du命令用來查詢檔案或目錄的磁盤使用空間,經過man獲取du命令的詳細介紹。經常使用的命令參數以下:
a:顯示所有目錄和其次目錄下的每一個檔案所佔的磁盤空間
b:大小用bytes來表示 (默認值爲k bytes)
c:最後再加上總計 (默認值)
s:只顯示各檔案大小的總合 (summarize)
x:只計算同屬同一個檔案系統的檔案
L:計算全部的檔案大小
經常使用命令:du -ah.net
舉例操做以下圖所示:3d
簡單總結一下:df與du的區別,du查看目錄大小,df查看磁盤使用狀況。
關於df和du詳細介紹能夠參考:
http://www.douban.com/group/topic/2833196
/http://blog.csdn.net/kmesg/article/details/6570800
四、statfs結構及函數
以前在看APUE時候,在第四章文件和目錄中,講到了獲取文件信息的stat結構,經過stat結構能夠獲文件的大小,建立時間,修改時間,用戶id,組id等等。關於stat結構請參考:http://linux.about.com/library/cmd/blcmdl2_stat.htm。man上stat結構及操做函數以下圖所示:
今天主要總結學習一下獲取硬盤信息的statfs結構,經過statfs結構的信息計算出路徑所在的磁盤使用狀況。
man上關於statfs介紹以下所示:
statfs結構的中文意思以下所示:
1 struct statfs 2 { 3 long f_type; /* 文件系統類型*/
4 long f_bsize; /* 通過優化的傳輸塊大小*/
5 long f_blocks; /* 文件系統數據塊總數*/
6 long f_bfree; /* 可用塊數*/
7 long f_bavail; /* 非超級用戶可獲取的塊數*/
8 long f_files; /* 文件結點總數*/
9 long f_ffree; /* 可用文件結點數*/
10 fsid_t f_fsid; /* 文件系統標識*/
11 long f_namelen; /* 文件名的最大長度*/
12 };
statfs結構中可用空間塊數有兩種f_bfree和 f_bavail,前者是硬盤全部剩餘空間,後者爲非root用戶剩餘空間,ext3文件系統給root用戶分有5%的獨享空間,因此這裏是不一樣的地方。這裏要強調的是每塊的大小通常是4K。所以,要實現與df結果一致的就得在得到塊數上乘以4,這樣已用、可用、總塊數就能夠實現。
測試程序以下所示:
1 #include <stdio.h>
2 #include <sys/statfs.h>
3 #include <sys/vfs.h>
4 #include <errno.h>
5
6 int main(int argc, char *argv[]) 7 { 8 struct statfs disk_info; 9 char *path = "/home/"; 10 int ret = 0; 11 if (argc == 2) 12 { 13 path = argv[1]; 14 } 15 if (ret == statfs(path, &disk_info) == -1) 16 { 17 fprintf(stderr, "Failed to get file disk infomation,\
18 errno:%u, reason:%s\n", errno, strerror(errno));
19 return -1; 20 } 21 long long total_size = disk_info.f_blocks * disk_info.f_bsize; 22 long long available_size = disk_info.f_bavail * disk_info.f_bsize; 23 long long free_size = disk_info.f_bfree * disk_info.f_bsize; 24 //輸出每一個塊的長度,linux下內存塊爲4KB
25 printf("block size: %ld bytes\n", disk_info.f_bsize); 26 //輸出塊個數
27 printf("total data blocks: %ld \n", disk_info.f_blocks); 28 //輸出path所在磁盤的大小
29 printf("total file disk size: %d MB\n",total_size >> 20); 30 //輸出非root用戶能夠用的磁盤空間大小
31 printf("avaiable size: %d MB\n",available_size >> 20); 32 //輸出硬盤的全部剩餘空間
33 printf("free size: %d MB\n",free_size >> 20); 34 //輸出磁盤上文件節點個數
35 printf("total file nodes: %ld\n", disk_info.f_files); 36 //輸出可用文件節點個數
37 printf("free file nodes: %ld\n", disk_info.f_ffree); 38 //輸出文件名最大長度
39 printf("maxinum length of file name: %ld\n", disk_info.f_namelen); 40 return 0; 41 }
測試結果以下所示:
五、參考網址:
http://hi.baidu.com/sei_zhouyu/item/e90c27b018ff4bf963388e70
http://www.cnblogs.com/hnrainll/archive/2011/05/11/2043361.html