fstat stat和lstat的區別

2021-06-17 22:04:54 字數 2619 閱讀 1628

stat系統呼叫系列包括了fstat、stat和lstat,它們都是用來返回「相關檔案狀態資訊」的,三者的不同之處在於設定原始檔的方式不同。

1

首先隆重介紹的是乙個非常重要的」vip」人物,他是fstat, stat和lstat三者都要用到的乙個結構體型別,名字叫做struct stat。可以說,沒有這個struct stat的支援,上述三個系統呼叫將寸步難行。

這個struct stat結構體在不同的unix/linux系統中的定義是有小的區別的,但你完全不用擔心,這並不會影響我們的使用。

在struct stat結構體中我們常用的且各個平台都一定有的域是:

st_mode 檔案許可權和檔案型別資訊 (記住這個黑體橘紅色)

st_ino   與該檔案關聯的inode

st_dev   儲存檔案的裝置

st_uid   檔案屬主的uid號

st_gid   檔案屬主的gid號

st_atime 檔案上一次被訪問的時間

st_ctime 檔案的許可權、屬主、組或內容上一次被修改的時間

st_mtime 檔案的內容上一次被修改的時間。(和st_ctime的不同之處顯而易見)

st_nlink  該檔案上硬連線的個數

我分別提取了solaris(unix)和fedora(linux)的struct stat結構體的原始定義:大家可以自己比對一下便可以發現兩者確實有所不同,但主要的域是完全相同的。

solaris的struct stat定義:

struct stat ;

fedora的struct stat定義:

struct stat

;2

大家一定注意到了,在上面列舉域的時候,我在st_mode處使用了黑體橘紅色標識,原因在於這個域不像其他域那麼容易使用,其他的域的值顯而易見,而st_mode域是需要一些巨集予以配合才能使用的。其實,通俗說,這些巨集就是一些特定位置為1的二進位制數的外號,我們使用它們和st_mode進行」&」操作,從而就可以得到某些特定的資訊。

檔案型別標誌包括:

s_ifblk:檔案是乙個特殊的塊裝置

s_ifdir:檔案是乙個目錄

s_ifchr:檔案是乙個特殊的字元裝置

s_ififo:檔案是乙個fifo裝置

s_ifreg:檔案是乙個普通檔案(reg即使regular啦)

其他模式標誌包括:

s_isuid:檔案設定了suid位

s_isgid:檔案設定了sgid位

s_isvtx:檔案設定了sticky位

用於解釋st_mode標誌的掩碼包括:

s_ifmt:檔案型別

s_irwxu:屬主的讀/寫/執行許可權,可以分成s_ixusr, s_irusr, s_iwusr

s_irwxg:屬組的讀/寫/執行許可權,可以分成s_ixgrp, s_irgrp, s_iwgrp

s_irwxo:其他使用者的讀/寫/執行許可權,可以分為s_ixoth, s_iroth, s_iwoth

還有一些用於幫助確定檔案型別的巨集定義,這些和上面的巨集不一樣,這些是帶有引數的巨集,類似與函式的使用方法:

s_isblk:測試是否是特殊的塊裝置檔案

s_ischr:測試是否是特殊的字元裝置檔案

s_isdir:測試是否是目錄(我估計find . -type d的源**實現中就用到了這個巨集)

s_isfifo:測試是否是fifo裝置

s_isreg:測試是否是普通檔案

s_issock:測試是否是socket

3

我們已經學習完了struct stat和各種st_mode相關巨集,現在就可以拿它們和stat系統呼叫相互配合工作了!

int fstat(int filedes, struct stat *buf);

int stat(const char *path, struct stat *buf);

int lstat(const char *path, struct stat *buf);

聰明人一眼就能看出來fstat的第乙個引數是和另外兩個不一樣的,對!fstat區別於另外兩個系統呼叫的地方在於,fstat系統呼叫接受的是 乙個「檔案描述符」,而另外兩個則直接接受「檔案全路徑」。檔案描述符是需要我們用open系統呼叫後才能得到的,而檔案全路經直接寫就可以了。

stat和lstat的區別:當檔案是乙個符號鏈結時,lstat返回的是該符號鏈結本身的資訊;而stat返回的是該鏈結指向的檔案的資訊。(似乎有些暈吧,這樣記,lstat比stat多了乙個l,因此它是有本事處理符號鏈結檔案的,因此當遇到符號鏈結檔案時,lstat當然不會放過。而 stat系統呼叫沒有這個本事,它只能對符號鏈結檔案睜乙隻眼閉乙隻眼,直接去處理鏈結所指檔案嘍)

判斷檔案是否存在的**例項

struct stat s;

int r = stat(pszdir, &s);

if((r == 0) && (s.st_mode & s_ifdir) == s_ifdir)

stat,fstat以及lstat函式

本章的討論的中心是三個stat函式以及它們所返回的資訊。include int stat const char pathname,struct stat buf int fstat int filedes,struct stat buf int lstat const char pathname,s...

stat,fstat以及lstat函式

stat,fstat以及lstat函式 本章的討論的中心是三個stat函式以及它們所返回的資訊。include int stat const char pathname,struct stat buf int fstat int filedes,struct stat buf int lstat c...

stat,fstat以及lstat函式

include int stat const char pathname,struct stat buf int fstat int filedes,struct stat buf int lstat const char pathname,struct stat buf 三個函式的返回 若成功為0...