fstat函式及struct stat結構

2puT發表於2016-07-11



   
一、fstat 函式
功能
:由檔案描述符取得檔案狀態。

相關函式:stat 、lstat 、chmod 、chown 、readlink 、utime。

標頭檔案:  #include<sys/stat.h>
         #include<unistd.h>

函式宣告: int fstat (int filedes,struct *buf);

描述: fstat()用來將引數filedes 所指向的檔案狀態複製到引數buf 所指向的結構中(structstat)。fstat()與stat()作用完全相同,不同之處在於傳入的引數為已開啟的檔案描述符。

返回值:執行成功返回0,失敗返回-1,錯誤程式碼儲存在errno。

下面舉一個小例子:
------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

main()
{
           struct stat buf;
           intfd;
           fd = open( "/etc/passwd", O_RDONLY);
           fstat (fd,&buf);
          printf("/etc/passwd file size = %d\n",(int)(buf.st_size));
}

------------------------------
執行結果:
/etc/passwd file size = 1656
   
也許,你看到這裡會產生和我一樣的疑惑:這個struct stat 結構到底是什麼樣的呢?
下面我就來詳細的介紹一下它了哦~~~      


二、struct stat結構體

定義如下:

struct stat { 
         dev_t     st_dev; // 檔案所在裝置ID 
         ino_t     st_ino;     // 結點(inode)編號  
         mode_t    st_mode;    // 保護模式 
         nlink_t   st_nlink;   // 硬連結個數  
         uid_t     st_uid;     // 所有者使用者ID  
         gid_t     st_gid;     // 所有者組ID  
         dev_t     st_rdev;    // 裝置ID(如果是特殊檔案) 
         off_t     st_size;    // 總體尺寸,以位元組為單位 
         blksize_t st_blksize; // 檔案系統 I/O 塊大小
         blkcnt_t  st_blocks;  // 已分配 512B 塊個數
         time_t    st_atime;   // 上次訪問時間 
         time_t    st_mtime;   // 上次更新時間 
         time_t    st_ctime;   // 上次狀態更改時間 
};

st_dev欄位描述該檔案所在的裝置。(major() 和minor()巨集可能在分析這個裝置ID域時有用。)

st_rdev 欄位描述這個檔案(inode)本身代表的裝置。

st_size欄位給出檔案位元組尺寸(如果它是一個普通檔案或符號連結)。對於符號連結而言是它所有包含路徑名長度,不包括結尾的空字元。

st_blocks 欄位指明檔案已經分配資料塊的個數,資料塊以 512 位元組為單位。(這可能小於st_size/512,當檔案有空洞時。)

st_blksize 給出對於高效檔案系統 I/O 操作的優先塊尺寸。(資料以小尺寸塊寫入檔案時可能導致低效的讀-更改-覆蓋 操作。)

不是所有的 Linux 檔案系統實現了所有的時間域。一些檔案系統允許掛載時不去訪問檔案或目錄且不會導致st_atime 欄位更新。(參考 mount() 的noatimenodiratimerelatime,以及mount() 中相關的資訊。)此外,如果檔案以O_NOATIME 標誌開啟,st_atime 不會被更新。

st_atime欄位在檔案訪問時更改,比如,execve()、mknod()、pipe()、utime() 和read()(多於零個位元組)。

st_mtime在檔案更改時更新,比如,mknod()、truncate()、utime() 和write()(多於零個位元組)。再者,一個目錄的st_mtime在這個目錄裡建立或刪除檔案時更新。st_mtime 在更改所有者、組、硬連結個數或許可權模式時 不會更新。

st_ctime 欄位在寫入或設定結點(inode)資訊(如所有者、組、連結數、許可權等等)時會更改。

下面 POSIX 巨集用於使用 st_mode 欄位測試檔案型別:

S_ISREG(m)
它是普通檔案嗎?
S_ISDIR(m)
目錄嗎?
S_ISCHR(m)
字元裝置?
S_ISBLK(m)
塊裝置?
S_ISFIFO(m)
FIFO(命名管道)?
S_ISLNK(m)
符號連結?(不在 POSIX.1-1996。)
S_ISSOCK(m)
套介面?(不在 POSIX.1-1996。)

下面標誌為 st_mode 域定義:

S_IFMT 0170000 檔案型別位域掩碼
S_IFSOCK 0140000 套介面
S_IFLNK 0120000 符號連結
S_IFREG 0100000 普通檔案
S_IFBLK 0060000 塊裝置
S_IFDIR 0040000 目錄
S_IFCHR 0020000 字元裝置
S_IFIFO 0010000 FIFO
S_ISUID 0004000 設定 UID 位
S_ISGID 0002000 設定 組ID 位 (看下面)
S_ISVTX 0001000 粘滯位(看下面)
S_IRWXU 00700 檔案所有者許可權掩碼
S_IRUSR 00400 所有者有讀許可權
S_IWUSR 00200 所有者有寫許可權
S_IXUSR 00100 所有者有執行許可權
S_IRWXG 00070 組許可權掩碼
S_IRGRP 00040 組有讀許可權
S_IWGRP 00020 組有寫許可權
S_IXGRP 00010 組有執行許可權
S_IRWXO 00007 其他使用者許可權掩碼(不在組內)
S_IROTH 00004 其他有讀許可權
S_IWOTH 00002 其他有寫許可權
S_IXOTH 00001 其他有執行許可權

設定組ID位S_ISGID)有多個特殊用處。對於一個目錄而言,它指明 BSD語義應用到這個目錄;建立的檔案繼承其父目錄的組ID,而不是來自建立程式的有效組ID,並且建立的目錄同時也會獲得S_SIGID位設定。對於一個沒有組執行許可權位(S_IXGRP)檔案而言,設定組ID位用於指明託管檔案/記錄鎖。

在目錄上的粘滯位(S_ISVTX)表示目錄裡的檔案只有其所有者,目錄所有者,和特權程式,可以對其進行重新命名或刪除。

相關文章