一、前言php
在嵌入式設備中,硬盤空間很是有限,在涉及到常常寫日誌的進程時候,須要考慮日誌的大小和刪除,否則很快就硬盤寫滿,致使日誌程序崩潰。爲了捕獲硬盤寫滿的異常場景,咱們須要在寫日誌過程當中判斷硬盤空間的使用狀況,根據硬盤的使用狀況,就能夠判斷是否寫滿了。若是將要寫滿了,就給出警告。這樣就能夠避免程序崩潰。首先看一下linux獲取硬盤和目錄大小的命令,最後總結一下statfs結構和函數。html
二、df命令node
Linux下能夠用df命令獲取硬盤的使用狀況,經過man能夠獲取df命令的詳細狀況。df命令常常用的參數爲:mysql
a:顯示所有的檔案系統和各分割區的磁盤使用情形
i:顯示i -nodes的使用量
k:大小用k來表示 (默認值)
t:顯示某一個檔案系統的全部分割區磁盤使用量
x:顯示不是某一個檔案系統的全部分割區磁盤使用量
T:顯示每一個分割區所屬的檔案系統名稱
經常使用命令:df -hi linux
舉例截圖以下所示sql
:數據庫
三、du命令數組
du命令用來查詢檔案或目錄的磁盤使用空間,經過man獲取du命令的詳細介紹。經常使用的命令參數以下:
a:顯示所有目錄和其次目錄下的每一個檔案所佔的磁盤空間
b:大小用bytes來表示 (默認值爲k bytes)
c:最後再加上總計 (默認值)
s:只顯示各檔案大小的總合 (summarize)
x:只計算同屬同一個檔案系統的檔案
L:計算全部的檔案大小
經常使用命令:du -ahsession
舉例操做以下圖所示:less
簡單總結一下:df與du的區別,du查看目錄大小,df查看磁盤使用狀況。
關於df和du詳細介紹能夠參考:
http://www.douban.com/group/topic/2833196
/http://blog.csdn.net/kmesg/article/details/6570800
df 和 du 命令詳解
df命令詳細用法
a:顯示所有的檔案系統和各分割區的磁盤使用情形
i:顯示i -nodes的使用量
k:大小用k來表示 (默認值)
t:顯示某一個檔案系統的全部分割區磁盤使用量
x:顯示不是某一個檔案系統的全部分割區磁盤使用量
T:顯示每一個分割區所屬的檔案系統名稱
經常使用命令:df -hi
操做詳解
引用
指令 df 能夠顯示目前全部檔案系統的最大可用空間及使用情形,請看下列這個例子:
# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 1.9G 389M 1.4G 21% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/ad0s1d 989M 54K 910M 0% /tmp
/dev/ad0s1f 4.8G 3.8G 657M 86% /usr
/dev/ad0s1e 1.9G 149M 1.6G 8% /var
/dev/ad0s1g 26G 890K 24G 0% /volume2
/dev/da0s1d 325G 261G 38G 87% /volume1
咱們加了參數 -h 表示使用「Human-readable」的輸出,也就是在檔案系統大小使用 GB、MB 等易讀的格式。
上面的指令輸出的第一個字段及最後一個字段分別是檔案系統及其掛入點。咱們能夠看到 /dev/ad0s1a 這個分割區被掛在根目錄下。咱們在上一小節提到過 ad 所表明的是 IDE 的硬盤,而 s1 表示第一個主要扇區。我另外有一個 SCSI 硬盤,它的代號是 da,它的容量很大,主要用來存放數據。devfs 是一個特別的檔案系統,該檔案系統並不是真的磁盤,而是 FreeBSD 用來管理系統硬件裝置的虛擬檔案系統。
接下來的四個字段 Size、Used、Avail、及 Capacity 分別是該分割區的容量、已使用的大小、剩下的大小、及使用的百分比。當硬盤容量已滿時,您可能會看到已使用的百分比超過 100%,由於 FreeBSD 會留一些空間給 root,讓 root 在檔案系統滿時,仍是能夠寫東西到該檔案系統中,以進行管理。
另外,咱們還可使用參數 -i 來查看目前檔案系統 inode 的使用情形。有的時候雖然檔案系統還有空間,但若沒有足夠的 inode 來存放檔案的信息,同樣會不能增長新的檔案。
# df -ih
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/ad0s1a 1.9G 389M 1.4G 21% 20495 262127 7% /
devfs 1.0K 1.0K 0B 100% 0 0 100% /dev
/dev/ad0s1d 989M 62K 910M 0% 24 141286 0% /tmp
/dev/ad0s1f 4.8G 3.8G 657M 86% 311439 348015 47% /usr
/dev/ad0s1e 1.9G 149M 1.6G 8% 1758 280864 1% /var
/dev/ad0s1g 26G 890K 24G 0% 12 3532786 0% /volume2
/dev/da0s1d 325G 261G 38G 87% 707277 43311409 2% /volume1
咱們能夠看到根目錄的已經用掉的 inode 數量爲 20495,還有 262127 的可用 inode。
小提示
還記得什麼是 inode 嗎?所謂的 inode 是用來存放檔案及目錄的基本信息 (metadata),包含時間、檔名、使用者及羣組等。在分割扇區時,系統會先作出一堆 inode 以供之後使用,inode 的數量關係着系統中能夠創建的檔案及目錄總數。若是要存的檔案大部分都很小,則一樣大小的硬盤中會有較多的檔案,也就是說須要較多的 inode 來掛檔案及目錄。
du:查詢檔案或目錄的磁盤使用空間
a:顯示所有目錄和其次目錄下的每一個檔案所佔的磁盤空間
b:大小用bytes來表示 (默認值爲k bytes)
c:最後再加上總計 (默認值)
s:只顯示各檔案大小的總合 (summarize)
x:只計算同屬同一個檔案系統的檔案
L:計算全部的檔案大小
經常使用命令:du -a
操做詳解
引用
指令 du 能以指定的目錄下的子目錄爲單位,顯示每一個目錄內全部檔案所佔用的磁盤空間大小。例如:
# du -h /etc
104K /etc/defaults
6.0K /etc/X11
8.0K /etc/bluetooth
4.0K /etc/gnats
52K /etc/isdn
388K /etc/mail
68K /etc/mtree
2.0K /etc/ntp
38K /etc/pam.d
44K /etc/periodic/daily
6.0K /etc/periodic/monthly
42K /etc/periodic/security
16K /etc/periodic/weekly
110K /etc/periodic
6.0K /etc/ppp
318K /etc/rc.d
2.0K /etc/skel
130K /etc/ssh
10K /etc/ssl
1.7M /etc
咱們目樣使用 -h 參數來顯示 human-readable 的格式。在應用時,咱們可使用 du 這個指令來查看哪一個目錄佔用最多的空間。不過,du 的輸出結果一般很長,咱們能夠加上 -s 參數來省略指定目錄下的子目錄,而只顯示該目錄的總合便可:
# du -sh /etc
1.7M /etc
在查看目錄的使用情形時,咱們能夠將輸出結果導到 sort 指令進行排序,以瞭解哪一個檔案用了最多的空間:
# du /etc | sort -nr | more
1746 /etc
388 /etc/mail
318 /etc/rc.d
130 /etc/ssh
110 /etc/periodic
104 /etc/defaults
68 /etc/mtree
52 /etc/isdn
44 /etc/periodic/daily
42 /etc/periodic/security
38 /etc/pam.d
16 /etc/periodic/weekly
10 /etc/ssl
8 /etc/bluetooth
6 /etc/ppp
6 /etc/periodic/monthly
6 /etc/X11
4 /etc/gnats
2 /etc/skel
2 /etc/ntp
sort 的參數 -nr 表示要以數字排序法進行反向排序,由於咱們要對目錄大小作排序,因此不可使用 human-readable 的大小輸出,否則目錄大小中會有 K、M 等字樣,會形成排序不正確。
linux的du和df命令
今天也有同窗問我Linux下查看目錄大小的命令,如今也將前陣子學習到du/df兩個命令總結一下吧。
前陣子測試工做中有遇到過因爲磁盤空間滿致使程序沒法執行到狀況,因此使用了df和du兩個命令。
du查看目錄大小,df查看磁盤使用狀況。
我常使用的命令(必要時,sudo使用root權限),
1.查看某個目錄的大小:du -hs /home/master/documents
查看目錄下全部目錄的大小並按大小降序排列:sudo du -sm /etc/* | sort -nr | less
2.查看磁盤使用狀況(文件系統的使用狀況):sudo df -h
df --block-size=GB
-h是使輸出結果更易於人類閱讀;du -s只展現目錄的使用總量(不分別展現各個子目錄狀況),-m是以MB爲單位展現目錄的大小(固然-k/-g就是KB/GB了)。
更多信息,仍是man du 和 man df 來得到吧。
du - estimate file space usage
Summarize disk usage of each FILE, recursively for directories.
df - report file system disk space usage
Show information about the file system on which each FILE resides, or all file systems by default.
df displays the amount of disk space available on the file system containing each file nameargument. If no file name is given, the space available on all currently mounted file systems is shown.
du
du的英文爲:disk usage,含義是磁盤空間使用狀況,功能是逐級進入指定目錄的每個子目錄並顯示該目錄佔用文件系統數據塊的狀況,若是沒有指定目錄,則對當前的目錄進行統計。
du的命令各個選項含義以下:
a:顯示所有目錄和其次目錄下的每一個檔案所佔的磁盤空間
s:只顯示各檔案大小的總合
b:大小用bytes來表示
x:跳過在不一樣文件系統上的目錄不予統計
a:遞歸地顯示指定目錄中各文件及子孫目錄中各文件佔用的數據塊數
...
使用du進行查看
root@tech163:/home/htmlfile# du
16 ./test
60 ./bbb
84 .
其中第一列是以塊爲單位計的磁盤空間容量,第二列列出目錄中使用這些空間的目錄名稱
1)查看當前目錄包含子目錄的大小
root@tech163:/home/htmlfile# du -sm .
1 .
其中的du -sm . 的「.」是表明當前目錄。
2)查看當前目錄以及子目錄的大小
root@tech163:/home/htmlfile# du -h
16K ./test
60K ./bbb
84K .
其中 -h 表示使用K,M,G的人性化形式顯示。
3)看到當前目錄下的bbb目錄大小,但不想查看其餘目錄以及子目錄
root@tech163:/home/htmlfile# du -ch bbb | tail -n 1
60K total
使用了管道包含了du和tail兩個命令,-c表示最後計算出所列目錄的大小之和。
4)列出當前目錄下全部目錄和文件的大小
root@tech163:/home/htmlfile# du -ah bbb
4.0K bbb/mysql.php
4.0K bbb/index.htm
4.0K bbb/p.php
28K bbb/memcache.php
12K bbb/.session.php.swp
4.0K bbb/hello.html
60K bbb
其中-a表示包含目錄和文件
5)不換行列出目錄以及子目錄大小的信息
root@tech163:/home/htmlfile# du -0h
16K ./test60K ./bbb84K .root@tech163:/home/htmlfile#
其中 -0 表示列出一條信息後不換行,接着輸出第二條信息。
df
於du不一樣的是,du是面向文件的命令,只計算被文件佔用的空間。不計算文件系統metadata 佔用的空間。df則是基於文件系統整體來計算,經過文件系統中未分配空間來肯定系統中已經分配空間的大小。df命令能夠獲取硬盤佔用了多少空間,還剩下多少空間,它也能夠顯示全部文件系統對i節點和磁盤塊的使用狀況。
df命令各個選擇的含義以下:
a:顯示所有的檔案系統和各分割區的磁盤使用情形
i:顯示i -nodes的使用量
k:大小用k來表示 (默認值)
t:顯示某一個檔案系統的全部分割區磁盤使用量
x:顯示不是某一個檔案系統的全部分割區磁盤使用量
T:顯示每一個分割區所屬的檔案系統名稱
....
使用df進行查看
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/cciss/c0d0p1 2068156 611572 1351528 32% /
tmpfs 1038080 4 1038076 1% /lib/init/rw
udev 10240 64 10176 1% /dev
tmpfs 1038080 4 1038076 1% /dev/shm
/dev/cciss/c0d0p9 130700120 44034236 86665884 34% /home
/dev/cciss/c0d0p7 2068156 68932 1999224 4% /tmp
/dev/cciss/c0d0p8 4132372 1760620 2161840 45% /usr
/dev/cciss/c0d0p6 2068156 330104 1632996 17% /var
第一行是文件系統對應的硬盤分區
第二行是分區包含的數據塊的數據(1數據庫爲1024字節)
第三四行是已用和未用的數據塊數組
第五行是普通用戶空間使用的百分比
第六行是文件系統的安裝點
其中第三四行已用和未用數據塊相加並不等於第二行總數據塊,這是由於分區留了少許空間提供給
系統管理員使用。
1)
chenyz@gzhouse:~$ df -h
文件系統 容量 已用 可用 已用% 掛載點
/dev/cciss/c0d0p1 2.0G 598M 1.3G 32% /
tmpfs 1014M 4.0K 1014M 1% /lib/init/rw
udev 10M 64K 10M 1% /dev
tmpfs 1014M 4.0K 1014M 1% /dev/shm
/dev/cciss/c0d0p9 125G 42G 83G 34% /home
/dev/cciss/c0d0p7 2.0G 68M 2.0G 4% /tmp
/dev/cciss/c0d0p8 4.0G 1.7G 2.1G 45% /usr
/dev/cciss/c0d0p6 2.0G 333M 1.6G 18% /var
其中 -h 表示使用K,M,G的人性化形式顯示。
2)
chenyz@gzhouse:~$ df -ia
文件系統 Inode (I)已用 (I)可用 (I)已用% 掛載點
/dev/cciss/c0d0p1 262752 60150 202602 23% /
tmpfs 224142 10 224132 1% /lib/init/rw
proc 0 0 0 - /proc
sysfs 0 0 0 - /sys
procbususb 0 0 0 - /proc/bus/usb
udev 224142 770 223372 1% /dev
tmpfs 224142 3 224139 1% /dev/shm
devpts 0 0 0 - /dev/pts
/dev/cciss/c0d0p9 130763968 1972907 128791061 2% /home
/dev/cciss/c0d0p7 262752 54 262698 1% /tmp
/dev/cciss/c0d0p8 524832 35743 489089 7% /usr
/dev/cciss/c0d0p6 262752 4896 257856 2% /var
所謂的 inode 是用來存放檔案及目錄的基本信息,包含時間、檔名、使用者及羣組等。在分割扇區時,系統會先作出一堆 inode 以供之後使用,inode 的數量關係着系統中能夠創建的檔案及目錄總數。若是要存的檔案大部分都很小,則一樣大小的硬盤中會有較多的檔案,也就是說須要較多的 inode 來掛檔案及目錄
四、statfs結構及函數
以前在看APUE時候,在第四章文件和目錄中,講到了獲取文件信息的stat結構,經過stat結構能夠獲文件的大小,建立時間,修改時間,用戶id,組id等等。關於stat結構請參考:http://linux.about.com/library/cmd/blcmdl2_stat.htm。man上stat結構及操做函數以下圖所示:
今天主要總結學習一下獲取硬盤信息的statfs結構,經過statfs結構的信息計算出路徑所在的磁盤使用狀況。
man上關於statfs介紹以下所示:
statfs結構的中文意思以下所示:
1 struct statfs 2 { 3 long f_type; /* 文件系統類型*/ 4 long f_bsize; /* 通過優化的傳輸塊大小*/ 5 long f_blocks; /* 文件系統數據塊總數*/ 6 long f_bfree; /* 可用塊數*/ 7 long f_bavail; /* 非超級用戶可獲取的塊數*/ 8 long f_files; /* 文件結點總數*/ 9 long f_ffree; /* 可用文件結點數*/ 10 fsid_t f_fsid; /* 文件系統標識*/ 11 long f_namelen; /* 文件名的最大長度*/ 12 };
statfs結構中可用空間塊數有兩種f_bfree和 f_bavail,前者是硬盤全部剩餘空間,後者爲非root用戶剩餘空間,ext3文件系統給root用戶分有5%的獨享空間,因此這裏是不一樣的地方。這裏要強調的是每塊的大小通常是4K。所以,要實現與df結果一致的就得在得到塊數上乘以4,這樣已用、可用、總塊數就能夠實現。
測試程序以下所示:
1 #include <stdio.h> 2 #include <sys/statfs.h> 3 #include <sys/vfs.h> 4 #include <errno.h> 5 6 int main(int argc, char *argv[]) 7 { 8 struct statfs disk_info; 9 char *path = "/home/"; 10 int ret = 0; 11 if (argc == 2) 12 { 13 path = argv[1]; 14 } 15 if (ret == statfs(path, &disk_info) == -1) 16 { 17 fprintf(stderr, "Failed to get file disk infomation,\ 18 errno:%u, reason:%s\n", errno, strerror(errno)); 19 return -1; 20 } 21 long long total_size = disk_info.f_blocks * disk_info.f_bsize; 22 long long available_size = disk_info.f_bavail * disk_info.f_bsize; 23 long long free_size = disk_info.f_bfree * disk_info.f_bsize; 24 //輸出每一個塊的長度,linux下內存塊爲4KB 25 printf("block size: %ld bytes\n", disk_info.f_bsize); 26 //輸出塊個數 27 printf("total data blocks: %ld \n", disk_info.f_blocks); 28 //輸出path所在磁盤的大小 29 printf("total file disk size: %d MB\n",total_size >> 20); 30 //輸出非root用戶能夠用的磁盤空間大小 31 printf("avaiable size: %d MB\n",available_size >> 20); 32 //輸出硬盤的全部剩餘空間 33 printf("free size: %d MB\n",free_size >> 20); 34 //輸出磁盤上文件節點個數 35 printf("total file nodes: %ld\n", disk_info.f_files); 36 //輸出可用文件節點個數 37 printf("free file nodes: %ld\n", disk_info.f_ffree); 38 //輸出文件名最大長度 39 printf("maxinum length of file name: %ld\n", disk_info.f_namelen); 40 return 0; 41 }
測試結果以下所示:
五、參考網址:
http://www.cnblogs.com/hnrainll/archive/2011/05/11/2043361.html
http://blog.sina.com.cn/s/blog_6385c7310100jk1f.html
linux stat函數講解
stat函數講解
表頭文件: #include <sys/stat.h>
#include <unistd.h>
定義函數: int stat(const char *file_name, struct stat *buf);
函數說明: 經過文件名filename獲取文件信息,並保存在buf所指的結構體stat中
返回值: 執行成功則返回0,失敗返回-1,錯誤代碼存於errno
錯誤代碼:
ENOENT 參數file_name指定的文件不存在
ENOTDIR 路徑中的目錄存在但卻非真正的目錄
ELOOP 欲打開的文件有過多符號鏈接問題,上限爲16符號鏈接
EFAULT 參數buf爲無效指針,指向沒法存在的內存空間
EACCESS 存取文件時被拒絕
ENOMEM 核心內存不足
ENAMETOOLONG 參數file_name的路徑名稱太長
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
int main() {
struct stat buf;
stat("/etc/hosts", &buf);
printf("/etc/hosts file size = %d\n", buf.st_size);
}
-----------------------------------------------------
struct stat {
dev_t st_dev; //文件的設備編號
ino_t st_ino; //節點
mode_t st_mode; //文件的類型和存取的權限
nlink_t st_nlink; //連到該文件的硬鏈接數目,剛創建的文件值爲1
uid_t st_uid; //用戶ID
gid_t st_gid; //組ID
dev_t st_rdev; //(設備類型)若此文件爲設備文件,則爲其設備編號
off_t st_size; //文件字節數(文件大小)
unsigned long st_blksize; //塊大小(文件系統的I/O 緩衝區大小)
unsigned long st_blocks; //塊數
time_t st_atime; //最後一次訪問時間
time_t st_mtime; //最後一次修改時間
time_t st_ctime; //最後一次改變時間(指屬性)
};
先前所描述的st_mode 則定義了下列數種狀況:
S_IFMT 0170000 文件類型的位遮罩
S_IFSOCK 0140000 scoket
S_IFLNK 0120000 符號鏈接
S_IFREG 0100000 通常文件
S_IFBLK 0060000 區塊裝置
S_IFDIR 0040000 目錄
S_IFCHR 0020000 字符裝置
S_IFIFO 0010000 先進先出
S_ISUID 04000 文件的(set user-id on execution)位
S_ISGID 02000 文件的(set group-id on execution)位
S_ISVTX 01000 文件的sticky位
S_IRUSR(S_IREAD) 00400 文件全部者具可讀取權限
S_IWUSR(S_IWRITE)00200 文件全部者具可寫入權限
S_IXUSR(S_IEXEC) 00100 文件全部者具可執行權限
S_IRGRP 00040 用戶組具可讀取權限
S_IWGRP 00020 用戶組具可寫入權限
S_IXGRP 00010 用戶組具可執行權限
S_IROTH 00004 其餘用戶具可讀取權限
S_IWOTH 00002 其餘用戶具可寫入權限
S_IXOTH 00001 其餘用戶具可執行權限
上述的文件類型在POSIX中定義了檢查這些類型的宏定義:
S_ISLNK (st_mode) 判斷是否爲符號鏈接
S_ISREG (st_mode) 是否爲通常文件
S_ISDIR (st_mode) 是否爲目錄
S_ISCHR (st_mode) 是否爲字符裝置文件
S_ISBLK (s3e) 是否爲先進先出
S_ISSOCK (st_mode) 是否爲socket
若一目錄具備sticky位(S_ISVTX),則表示在此目錄下的文件只能被該文件全部者、此目錄全部者或root來刪除或更名。
-----------------------------------------------------
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; //文件系統id
long f_namelen; //文件名的最大長度
long f_spare[6]; //spare for later
};
stat、fstat和lstat函數(UNIX)
#include<sys/types.h>
#include<sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf);
提供文件名字,獲取文件對應屬性。感受通常是文件沒有打開的時候這樣操做。
int fstat(int filedes, struct stat *buf);
經過文件描述符獲取文件對應的屬性。文件打開後這樣操做
int lstat(const char *restrict pathname, struct stat *restrict buf);
鏈接文件
三個函數的返回:若成功則爲0,若出錯則爲-1
給定一個pathname,stat函數返回一個與此命名文件有關的信息結構,fstat函數得到已在描述符filedes上打開的文件的有關信息。lstat函數相似於stat,可是當命名的文件是一個符號鏈接時,lstat返回該符號鏈接的有關信息,而不是由該符號鏈接引用的文件的信息。
第二個參數是個指針,它指向一個咱們應提供的結構。這些函數填寫由buf指向的結構。該結構的實際定義可能隨實現而有所不一樣,但其基本形式是:
struct stat{
mode_t st_mode; /*file tpye &mode (permissions)*/
ino_t st_ino; /*i=node number (serial number)*/
dev_t st_rdev; /*device number for special files*/
nlink_t st_nlink; /*number of links*/
uid_t st_uid; /*user id of owner*/
gid_t st_gid; /*group ID of owner*/
off_t st_size; /*size in bytes for regular files*/
time_t st_atime; /*time of last access*/
time_t st_mtime; /*time of last modification*/
time_t st_ctime; /*time of last file status change*/
long st_blksize; /*best I/O block size */
long st_blocks; /*number of 512-byte blocks allocated*/
};
注意,除最後兩個之外,其餘各成員都爲基本系統數據類型。咱們將說明此結構的每一個成員以瞭解文件屬性。
使用stat函數最多的多是ls-l命令,用其能夠得到有關一個文件的全部信息。
1 函數都是獲取文件(普通文件,目錄,管道,socket,字符,塊()的屬性。
函數原型
#include <sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf);
提供文件名字,獲取文件對應屬性。
int fstat(int filedes, struct stat *buf);
經過文件描述符獲取文件對應的屬性。
int lstat(const char *restrict pathname, struct stat *restrict buf);
鏈接文件描述命,獲取文件屬性。
2 文件對應的屬性
struct stat {
mode_t st_mode; //文件對應的模式,文件,目錄等
ino_t st_ino; //inode節點號
dev_t st_dev; //設備號碼
dev_t st_rdev; //特殊設備號碼
nlink_t st_nlink; //文件的鏈接數
uid_t st_uid; //文件全部者
gid_t st_gid; //文件全部者對應的組
off_t st_size; //普通文件,對應的文件字節數
time_t st_atime; //文件最後被訪問的時間
time_t st_mtime; //文件內容最後被修改的時間
time_t st_ctime; //文件狀態改變時間
blksize_t st_blksize; //文件內容對應的塊大小
blkcnt_t st_blocks; //偉建內容對應的塊數量
};
能夠經過上面提供的函數,返回一個結構體,保存着文件的信息。
statfs得到硬盤使用狀況
先說statfs結構:
#include <sys/vfs.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;
};
statfs結構中可用空間塊數有兩種f_bfree和 f_bavail,前者是硬盤全部剩餘空間,後者爲非root用戶剩餘空間,ext3文件系統給root用戶分有5%的獨享空間,因此這裏是不一樣的地方。這裏要強調的是每塊的大小通常是4K。所以,要實現與df結果一致的就得在得到塊數上乘以4,這樣已用、可用、總塊數就能夠實現。若是還要實現百分比一致,那麼要注意的是,df命令得到是整數百分比,沒有小數,這裏使用的進一法,而不是四捨五入法。因此在程序裏直接+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$