1. 程式人生 > >C語言中fstat stat和lstat 區別

C語言中fstat stat和lstat 區別

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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檔案是我自己隨便寫的一個檔案,可以是任何檔案,但是要有可讀許可權。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述