文章出處

1、前言

  在嵌入式設備中,硬盤空間非常有限,在涉及到經常寫日志的進程時候,需要考慮日志的大小和刪除,不然很快就硬盤寫滿,導致日志程序崩潰。為了捕獲硬盤寫滿的異常場景,我們需要在寫日志過程中判斷硬盤空間的使用情況,根據硬盤的使用情況,就可以判斷是否寫滿了。如果將要寫滿了,就給出警告。這樣就可以避免程序崩潰。首先看一下linux獲取硬盤和目錄大小的命令,最后總結一下statfs結構和函數。

2、df命令

  Linux下可以用df命令獲取硬盤的使用情況,通過man可以獲取df命令的詳細情況。df命令經常用的參數為:

  a:顯示全部的檔案系統和各分割區的磁盤使用情形 
  i:顯示i -nodes的使用量 
  k:大小用k來表示 (默認值) 
  t:顯示某一個檔案系統的所有分割區磁盤使用量 
  x:顯示不是某一個檔案系統的所有分割區磁盤使用量 
  T:顯示每個分割區所屬的檔案系統名稱 
  常用命令:df -hi 

舉例截圖如下所示

3、du命令

  du命令用來查詢檔案或目錄的磁盤使用空間,通過man獲取du命令的詳細介紹。常用的命令參數如下: 
  a:顯示全部目錄和其次目錄下的每個檔案所占的磁盤空間 
  b:大小用bytes來表示 (默認值為k bytes) 
  c:最后再加上總計 (默認值) 
  s:只顯示各檔案大小的總合 (summarize) 
  x:只計算同屬同一個檔案系統的檔案 
  L:計算所有的檔案大小 
  常用命令:du -ah

舉例操作如下圖所示:

簡單總結一下:df與du的區別,du查看目錄大小,df查看磁盤使用情況。

關于df和du詳細介紹可以參考:

http://www.douban.com/group/topic/2833196

/http://blog.csdn.net/kmesg/article/details/6570800

4、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 }

測試結果如下所示:

5、參考網址:

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


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()