天天看點

fstatfs/statfs詳解

【fstatfs/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;  /* 檔案名的最大長度 */

};

相關的檔案系統類型有:

      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

傳回說明:  

成功執行時,傳回0。失敗傳回-1,errno被設為以下的某個值  

EACCES: (statfs())檔案或路徑名中包含的目錄不可通路

EBADF : (fstatfs()) 檔案描述詞無效

EFAULT: 記憶體位址無效

EINTR : 操作由信号中斷

EIO    : 讀寫出錯

ELOOP : (statfs())解釋路徑名過程中存在太多的符号連接配接

ENAMETOOLONG:(statfs()) 路徑名太長

ENOENT:(statfs()) 檔案不存在

ENOMEM: 核心記憶體不足

ENOSYS: 檔案系統不支援調用

ENOTDIR:(statfs())路徑名中當作目錄的元件并非目錄

EOVERFLOW:資訊溢出

一個簡單的例子:

#include <sys/vfs.h>

#include <stdio.h>

int main()

{

    struct statfs diskInfo;

    statfs("/",&diskInfo);

    unsigned long long blocksize = diskInfo.f_bsize;// 每個block裡面包含的位元組數

    unsigned long long totalsize = blocksize * diskInfo.f_blocks;//總的位元組數

    printf("TOTAL_SIZE == %lu MB/n",totalsize>>20); // 1024*1024 =1MB  換算成MB機關

    unsigned long long freeDisk = diskInfo.f_bfree*blocksize; //再計算下剩餘的空間大小

    printf("DISK_FREE == %ld MB/n",freeDisk>>20);

 return 0;

}