C語言中fstat stat和lstat 區別
阿新 • • 發佈:2018-11-11
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
在寫應用程式的時候發現我們經常回去檢測一個檔案的大小,有了大小才能對映這個檔案到記憶體上,方便我們直接操作。
在介紹三者的區別之前,首先介紹的是一個非常重要的結構體型別,名字叫做struct stat,這是一個儲存檔案狀態資訊的結構體,其型別如下:
struct stat
{
dev_t st_dev; /* 檔案所在裝置的標識 */
ino_t st_ino; /* 檔案結點號 */
mode_t st_mode; /* 檔案保護模式 */
nlink_t st_nlink; /* 硬連線數 */
uid_t st_uid; /* 檔案使用者標識 */
gid_t st_gid; /* 檔案使用者組標識 */
dev_t st_rdev; /* 檔案所表示的特殊裝置檔案的裝置標識 */
off_t st_size; /* 總大小,位元組為單位 */
blksize_t st_blksize; /* 檔案系統的塊大小 */
blkcnt_t st_blocks; /* 分配給檔案的塊的數量,512位元組為單元 */
time_t st_atime; /* 最後訪問時間 */
time_t st_mtime; /* 最後修改時間 */
time_t st_ctime; /* 最後狀態改變時間 */
};
tips:這裡需要注意的是st_mode這個域不像其他域那麼容易使用,需要一些巨集予以配合。實際上這些巨集就是一些特定位置為1的二進位制數的綽號,我們使用它們和st_mode進行”&”操作,從而就可以得到某些特定的資訊。
檔案型別標誌包括:
S_IFBLK:檔案是一個特殊的塊裝置
S_IFDIR:檔案是一個目錄
S_IFCHR:檔案是一個特殊的字元裝置
S_IFIFO:檔案是一個FIFO裝置
S_IFREG:檔案是一個普通檔案
S_IFLNK:檔案是一個符號連結
其他模式標誌包括:
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:測試是否是目錄
S_ISFIFO:測試是否是FIFO裝置
S_ISREG:測試是否是普通檔案
S_ISLNK:測試是否是符號連結
S_ISSOCK:測試是否是socket
fstat/stat/lstat系統呼叫
功能描述:
獲取一些檔案相關的資訊。
用法:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);
int fstat(int filedes, struct stat *buf);int lstat(const char *path, struct stat *buf);
引數:
path:檔案路徑名。
filedes:檔案描述詞。
buf:儲存檔案資訊的結構體
返回說明:
成功執行時,返回0。失敗返回-1,errno被設為以下的某個值
EBADF: 檔案描述詞無效
EFAULT: 地址空間不可訪問
ELOOP: 遍歷路徑時遇到太多的符號連線
ENAMETOOLONG:檔案路徑名太長
ENOENT:路徑名的部分元件不存在,或路徑名是空字串
ENOMEM:記憶體不足
ENOTDIR:路徑名的部分元件不是目錄
下面放大的部分是他們的區別:
fstat區別於另外兩個系統呼叫的地方在於,fstat系統呼叫接受的是 一個“檔案描述符”,而另外兩個則直接接受“檔案全路徑”。檔案描述符是需要我們用open系統呼叫後才能得到的,而檔案全路經直接寫就可以了。
stat和lstat的區別:當檔案是一個符號連結時,lstat返回的是該符號連結本身的資訊;而stat返回的是該連結指向的檔案的
下面用一個例子還說明:
這個file檔案是我自己隨便寫的一個檔案,可以是任何檔案,但是要有可讀許可權。