【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;
}