statfs獲得硬碟使用方式 類比linux命令 df

來源:互聯網
上載者:User

說明:本文以主要為轉載內容,同時加入了我在使用過程中遇到問題對其的修正!!!!!!!!!

 

先說statfs結構:
#include <sys/vfs.h>    /* 或者 <sys/statfs.h> */

int statfs(const char *path, struct statfs *buf);
int fstatfs(int fd, struct statfs *buf);

參數:  
path: 位於需要查詢資訊的檔案系統的檔案路徑名(不是裝置名稱,是掛載點名稱)。    
fd: 位於需要查詢資訊的檔案系統的檔案描述詞。
buf:以下結構體的指標變數,用於儲存檔案系統相關的資訊

struct statfs
{
   long    f_type;     /* 檔案系統類型  */
   long    f_bsize;    /* 經過最佳化的傳輸塊大小  */
   long    f_blocks;   /* 檔案系統資料區塊總數 */
   long    f_bfree;    /* 可用塊數 */
   long    f_bavail;   /* 非超級使用者可擷取的塊數 */
   long    f_files;    /* 檔案結點總數 */
   long    f_ffree;    /* 可用檔案結點數 */
   fsid_t  f_fsid;     /* 檔案系統標識 */
   long    f_namelen;  /* 檔案名稱的最大長度 */
};
***************************************************************
返回說明:  
成功執行時,返回0。失敗返回-1,errno被設為以下的某個值  
 
EACCES: (statfs())檔案或路徑名中包含的目錄不可訪問
EBADF : (fstatfs()) 檔案描述詞無效
EFAULT: 記憶體位址無效
EINTR : 操作由訊號中斷
EIO    : 讀寫出錯
ELOOP : (statfs())解釋路徑名過程中存在太多的符號串連
ENAMETOOLONG:(statfs()) 路徑名太長
ENOENT:(statfs()) 檔案不存在
ENOMEM: 核心記憶體不足
ENOSYS: 檔案系統不支援調用
ENOTDIR:(statfs())路徑名中當作目錄的組件並非目錄
EOVERFLOW:資訊溢出
**********************************************************************
相關的檔案系統類型有:
      ADFS_SUPER_MAGIC      0xadf5
      AFFS_SUPER_MAGIC      0xADFF
      BEFS_SUPER_MAGIC      0x42465331
   BFS_MAGIC             0x1BADFACE
   CIFS_MAGIC_NUMBER     0xFF534D42
   CODA_SUPER_MAGIC      0x73757245
      COH_SUPER_MAGIC       0x012FF7B7
   CRAMFS_MAGIC          0x28cd3d45
      DEVFS_SUPER_MAGIC     0x1373
      EFS_SUPER_MAGIC       0x00414A53
   EXT_SUPER_MAGIC       0x137D
   EXT2_OLD_SUPER_MAGIC 0xEF51
   EXT2_SUPER_MAGIC      0xEF53
   EXT3_SUPER_MAGIC      0xEF53
   HFS_SUPER_MAGIC       0x4244
   HPFS_SUPER_MAGIC      0xF995E849
   HUGETLBFS_MAGIC       0x958458f6
   ISOFS_SUPER_MAGIC     0x9660
   JFFS2_SUPER_MAGIC     0x72b6
   JFS_SUPER_MAGIC       0x3153464a
      MINIX_SUPER_MAGIC     0x137F /* orig. minix */
   MINIX_SUPER_MAGIC2    0x138F /* 30 char minix */
   MINIX2_SUPER_MAGIC    0x2468 /* minix V2 */
      MINIX2_SUPER_MAGIC2   0x2478 /* minix V2, 30 char names */
   MSDOS_SUPER_MAGIC     0x4d44
   NCP_SUPER_MAGIC       0x564c
   NFS_SUPER_MAGIC       0x6969
   NTFS_SB_MAGIC         0x5346544e
   OPENPROM_SUPER_MAGIC 0x9fa1
     PROC_SUPER_MAGIC      0x9fa0
   QNX4_SUPER_MAGIC      0x002f
      REISERFS_SUPER_MAGIC 0x52654973
   ROMFS_MAGIC           0x7275
   SMB_SUPER_MAGIC       0x517B
   SYSV2_SUPER_MAGIC     0x012FF7B6
   SYSV4_SUPER_MAGIC     0x012FF7B5
      TMPFS_MAGIC           0x01021994
   UDF_SUPER_MAGIC       0x15013346
   UFS_MAGIC             0x00011954
    USBDEVICE_SUPER_MAGIC 0x9fa2
   VXFS_SUPER_MAGIC      0xa501FCF5
   XENIX_SUPER_MAGIC     0x012FF7B4
   XFS_SUPER_MAGIC       0x58465342
   _XIAFS_SUPER_MAGIC    0x012FD16D

**********************************************************************
statfs結構中可用空間塊數有兩種f_bfree和 f_bavail,前者是硬碟所有剩餘空間,後

者為非root使用者剩餘空間,ext3檔案系統給root使用者分有5%的獨享空間,所以這裡是不

同的地方。這裡要強調的是每塊的大小一般是4K(×這句話錯誤,不一定都是4k,正確做法是:總大小= sfs.f_blocks×f_bsize,即塊數×每塊的大小,單位是bytes,也就是要/1024/1024/1024才是GB單位,另外要注意的問題是sfs.f_blocks×f_bsize資料過大溢出,可以sfs.f_blocks/1024×f_bsize/1024=MB單位)。因此,要實現與df結果一致的就得在

獲得塊數上乘以4,這樣已用、可用、總塊數就可以實現。如果還要實現百分比一致,

那麼要注意的是,df命令獲得是整數百分比,沒有小數,這裡使用的進一法,而不是四

舍五入法。所以在程式裡直接+1取整。

                   disk_size = sfs.f_blocks/1024*sfs.f_bsize/1024;//MB總大小

                   avilable =sfs.f_bavail/1024*sfs.f_bsize/1024;//MB可以空間大小

                   double all=sfs.f_blocks - sfs.f_bfree + sfs.f_bavail;

                   if(0!=all)

                   percent = (sfs.f_blocks - sfs.f_bfree ) * 100 / all + 1;可用百分比

 

下面是實現的一個例子:(home目錄為一個獨立分區)

#include <stdio.h>
#include <sys/vfs.h>

int main()
{
    struct statfs sfs;
    int i = statfs("/home", &sfs);
    int percent = (sfs.f_blocks - sfs.f_bfree ) * 100 / (sfs.f_blocks -

sfs.f_bfree + sfs.f_bavail) + 1;
    printf("/dev/sda11            %ld    %ld  %ld   %d%% /home/n",
                           4*sfs. f_blocks, 4*(sfs.f_blocks - sfs.f_bfree), 

    4*sfs.f_bavail, percent);
    system("df /home ");
    return 0;

}

執行結果:

leave@LEAVE:~/test$ gcc -o df df.c
leave@LEAVE:~/test$ ./df
/dev/sda11            42773008    540356  40059864   2% /home
檔案系統           1K-塊        已用     可用 已用% 掛載點
/dev/sda11            42773008    540356  40059864   2% /home
leave@LEAVE:~/test$

 

/home/work $ df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/mmc1                19444      9804      9640  50% /boot
/dev/mmc2                11678        78     11600   1% /setting
/dev/mmc5               160730    126767     25665  83% /home
/dev/mmc6              1758860     35492   1634020   2% /storage
/dev/sdb1            312568828  42536564 270032264  14% /c2-media/usb/USB2

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.