利用系統調用stat()、lstat()以及fstat(),可獲取與文件有關的信息,其中大部分提取自文件i節點。以上3個系統調用之間僅有的區別在於對文件的描述方式不同。
1 stat()返回所命名文件的相關信息。
2 lstat()與stat()類似,區別在於如果文件屬於符號鏈接,那麼所返回的信息針對的是符號鏈接自身(而非符號鏈接所指向的文件)。
3 fstat()則返回由某個打開文件描述符所指代文件的相關信息。
系統調用stat()和lstat()不需要對所操作的文件本身擁有任何權限,但針對指定pathname的父目錄要有執行(搜索)權限。而只要為它提供有效的文件描述符,fstat()系統調用總是成功的。
Linux stat函數講解(獲取文件詳細信息) http://www.linuxidc.com/Linux/2011-08/40701.htm
《Unix環境高級編程》(第二版)apue.h的錯誤 http://www.linuxidc.com/Linux/2011-04/34662.htm
Unix環境高級編程第二版讀書筆記 http://www.linuxidc.com/Linux/2011-04/34235.htm
《Unix環境高級編程》中apue.h的問題 http://www.linuxidc.com/Linux/2013-01/77686.htm
上述所有系統調用都會在緩沖區中返回一個由statbuf指向的stat結構,其格式如下:
設備ID和i節點號
st_dev字段標識文件所駐留的設備。st_ino字段包含了文件的i節點號。利用這兩個字段,可以在所有文件系統中唯一表示某個文件。
如果是針對設備的i節點,那麼st_rdev字段則包含設備的主、輔ID。利用宏major()和minor(),可以提取主、輔ID。在Linux系統上,要使用這兩個宏,需要定義_BSD_SOURCE宏,然後include定義這兩個宏的頭文件<sys/types.h>。
由於major()和minor()所返回的整型值大小隨UINX實現的不同而各有不用。為保證可移植性,打印時總是將返回值強制轉換為long。
文件所有權
st_uid和st_gid字段分別表示文件的屬主(用戶ID)和屬組(組ID)。
鏈接數
st_nlink字段包含了指向文件的(硬)鏈接數。
文件類型及權限
st_mode字段內含有位掩碼,起表示文件類型和指定文件權限的雙重作用。下圖為該字段所含各位的布局情況。
文件類型
權限
U
G
T
R
W
X
R
W
X
R
W
X
Linux使用了st_mode字段中的4位來標識文件類型位。st_mode字段與常量S_IFMT相與(&),可從該字段中提取出文件類型。將計算結果與一系列常量進行比較,即可確定文件類型:
if((statbuf.st_mode & S_IFMT) == S_IFREG)
printf(“regularfile\n”);
在Linux中可利用標准宏將其簡化:
if(S_ISREG(statbuf.st_mode))
printf(“regularfile\n”);
常 量
測 試 宏
文 件 類 型
S_IFREG
S_ISREG()
常規文件
S_IFDIR
S_ISDIR()
目錄
S_IFCHR
S_ISCHR()
字符設備
S_IFBLK
S_ISBLK()
塊設備
S_IFIFO
S_ISFIFO()
FIFO或管道
S_IFSOCK
S_ISSOCK()
套接字
S_IFLNK
S_ISLNK()
符號鏈接
針對stat結構中的st_mode來檢查文件類型的宏
想從<sys/stat.h>中獲取S_IFSOCK和S_ISSOCK()的定義,必須定義_BSD_SOURCE特性測試宏,或將_XOPEN_SOURCE定義為不小於500的值。
st_mode字段的低12位定義了文件權限。最低9位分別用來表示文件屬主、屬組以及其他用戶的讀、寫、執行權限。
文件大小、已分配塊以及最優I/O塊大小
對於常規文件,st_size字段表示文件的字節數。對於符號鏈接,st_size字段則表示鏈接所指路徑名的長度,以字節為單位。對於共享內存對象,該字段則表示對象的大小。
st_blocks字段表示分配給文件的總塊數,塊大小為512字節,其中包括了為指針塊所分配的空間。st_blocks字段記錄了實際分配給文件的磁盤塊數量。如果文件內含空洞,該值將小於從相應文件字節數字段(st_size)的值。
st_blksize字段所指並非底層文件系統的塊大小,而是針對文件系統上文件進行I/O操作時的最優塊大小(以字節為單位)。一般而言,st_blksize的返回值為4096。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-06/103005p2.htm