轉(zhuǎn):https://blog.csdn.net/a1989a132/article/details/8848485
說明:本文以主要為轉(zhuǎn)載內(nèi)容,純?nèi)沼浻枚角荩缔D(zhuǎn)載。
先說statfs結(jié)構(gòu):
include <sys/vfs.h> /* 或者 <sys/statfs.h> */
int statfs(const char *path, struct statfs *buf);
int fstatfs(int fd, struct statfs *buf);
參數(shù):
path: 位于需要查詢信息的文件系統(tǒng)的文件路徑名(不是設(shè)備名喳资,是掛載點名稱)鲁猩。
fd: 位于需要查詢信息的文件系統(tǒng)的文件描述詞轰异。
buf:以下結(jié)構(gòu)體的指針變量,用于儲存文件系統(tǒng)相關(guān)的信息
struct statfs
{
long f_type; /* 文件系統(tǒng)類型 /
long f_bsize; / 經(jīng)過優(yōu)化的傳輸塊大小 /
long f_blocks; / 文件系統(tǒng)數(shù)據(jù)塊總數(shù) /
long f_bfree; / 可用塊數(shù) /
long f_bavail; / 非超級用戶可獲取的塊數(shù) /
long f_files; / 文件結(jié)點總數(shù) /
long f_ffree; / 可用文件結(jié)點數(shù) /
fsid_t f_fsid; / 文件系統(tǒng)標識 /
long f_namelen; / 文件名的最大長度 */
};
返回說明:
成功執(zhí)行時暑始,返回0搭独。失敗返回-1,errno被設(shè)為以下的某個值
EACCES: (statfs())文件或路徑名中包含的目錄不可訪問
EBADF : (fstatfs()) 文件描述詞無效
EFAULT: 內(nèi)存地址無效
EINTR : 操作由信號中斷
EIO : 讀寫出錯
ELOOP : (statfs())解釋路徑名過程中存在太多的符號連接
ENAMETOOLONG:(statfs()) 路徑名太長
ENOENT:(statfs()) 文件不存在
ENOMEM: 核心內(nèi)存不足
ENOSYS: 文件系統(tǒng)不支持調(diào)用
ENOTDIR:(statfs())路徑名中當作目錄的組件并非目錄
EOVERFLOW:信息溢出
相關(guān)的文件系統(tǒng)類型有:
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結(jié)構(gòu)中可用空間塊數(shù)有兩種f_bfree和 f_bavail廊镜,前者是硬盤所有剩余空間牙肝,后
者為非root用戶剩余空間,ext3文件系統(tǒng)給root用戶分有5%的獨享空間嗤朴,所以這里是不
同的地方配椭。這里要強調(diào)的是每塊的大小一般是4K(×這句話錯誤,不一定都是4k雹姊,正確做法是:總大小= sfs.f_blocks×f_bsize股缸,即塊數(shù)×每塊的大小,單位是bytes吱雏,也就是要/1024/1024/1024才是GB單位敦姻,另外要注意的問題是sfs.f_blocks×f_bsize數(shù)據(jù)過大溢出,可以sfs.f_blocks/1024×f_bsize/1024=MB單位)坎背。因此替劈,要實現(xiàn)與df結(jié)果一致的就得在
獲得塊數(shù)上乘以4寄雀,這樣已用得滤、可用、總塊數(shù)就可以實現(xiàn)盒犹。如果還要實現(xiàn)百分比一致懂更,
那么要注意的是,df命令獲得是整數(shù)百分比急膀,沒有小數(shù)沮协,這里使用的進一法,而不是四
舍五入法卓嫂。所以在程序里直接+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;可用百分比
下面是實現(xiàn)的一個例子:(home目錄為一個獨立分區(qū))
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",
4sfs. f_blocks, 4(sfs.f_blocks - sfs.f_bfree),
4*sfs.f_bavail, percent);
system("df /home ");
return 0;
}
執(zhí)行結(jié)果:
leave@LEAVE:~/test$ gcc -o df df.c
leave@LEAVE:~/test$ ./df
/dev/sda11 42773008 540356 40059864 2% /home
文件系統(tǒng) 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
(mociml)
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或編譯歡迎任何形式的轉(zhuǎn)載晨雳,但請務(wù)必注明出處行瑞,尊重他人勞動,同學習共成長餐禁。轉(zhuǎn)載請注明:文章轉(zhuǎn)載自:羅索實驗室 [http://www.rosoo.net/a/201212/16416.html]