struct statfs

轉(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]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末血久,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子帮非,更是在濱河造成了極大的恐慌氧吐,老刑警劉巖讹蘑,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異筑舅,居然都是意外死亡座慰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門翠拣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來角骤,“玉大人,你說我怎么就攤上這事心剥“钭穑” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵优烧,是天一觀的道長蝉揍。 經(jīng)常有香客問我,道長畦娄,這世上最難降的妖魔是什么又沾? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮熙卡,結(jié)果婚禮上杖刷,老公的妹妹穿的比我還像新娘。我一直安慰自己驳癌,他們只是感情好滑燃,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颓鲜,像睡著了一般表窘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上甜滨,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天乐严,我揣著相機與錄音,去河邊找鬼衣摩。 笑死昂验,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的艾扮。 我是一名探鬼主播既琴,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼栏渺!你這毒婦竟也來了呛梆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤磕诊,失蹤者是張志新(化名)和其女友劉穎填物,沒想到半個月后纹腌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡滞磺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年升薯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片击困。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡涎劈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阅茶,到底是詐尸還是另有隱情蛛枚,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布脸哀,位于F島的核電站蹦浦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏撞蜂。R本人自食惡果不足惜盲镶,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝌诡。 院中可真熱鬧溉贿,春花似錦、人聲如沸浦旱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闽寡。三九已至代兵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爷狈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工裳擎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涎永,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓鹿响,卻偏偏與公主長得像羡微,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惶我,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354