linux下獲取硬盤使用狀況[總結]

一、前言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

http://blog.sina.com.cn/s/blog_6385c7310100jk1f.html

相關文章
相關標籤/搜索