標籤:就會 索引 符號 原因 資訊 ima 訪問時間 ctime 存在
stat命令
stat既有命令也有同名函數,用來擷取檔案Inode裡主要資訊,所以stat命令的輸出資訊比ls命令的輸出資訊要更詳細,stat 跟蹤符號連結,lstat不跟蹤符號連結,其中會輸出對應檔案的檔案名稱(File)、檔案大小(Size)、佔用物理扇區數(Blocks)、系統塊大小(IO Block)、檔案類型(前一篇部落格中介紹的)、裝置的主編號和次編號(Device做驅動程式時經常用到,在系統層面幾乎用不到吧)、檔案索引號(Inode檔案節點)、永久連結個數(Links)、許可權(Access)、使用者id(Uid)、組id(Gid)、還有三個重要的時間。
stat裡面時間辨析:
atime(最近訪問時間access time): 最近開啟檔案的時間,讀一次這個檔案的內容,這個時間就會更新。比如對這個檔案運用 more、cat等命令。但是ls、stat命令都不會修改檔案的訪問時間(在上一篇部落格中已經介紹原因)。
mtime(最近更改時間modifiy time): 指最近修改檔案內容的時間 ,修改時間,修改時間是檔案內容最後一次被修改時間。比如:vi後儲存檔案。ls -l列出的時間就是這個時間。
ctime(最近改動時間change time): 指最近改動Inode的時間,狀態改動時間。是該檔案的i節點最後一次被修改的時間,通過chmod、chown命令修改一次檔案屬性,這個時間就會更新。
#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int stat(const char *path, struct stat *buf);int fstat(int fd, struct stat *buf);int lstat(const char *path, struct stat *buf);struct stat {dev_t st_dev; /* ID of device containing file 檔案的裝置編號*/ino_t st_ino; /* inode number 檔案索引號(Inode檔案節點)*/mode_t st_mode; /* protection 檔案的類型和存取的許可權*/nlink_t st_nlink; /* number of hard links 連到該檔案的硬串連數目, 剛建立的檔案值為1.*/uid_t st_uid; /* user ID of owner 檔案所有者的使用者識別碼*/gid_t st_gid; /* group ID of owner 檔案所有者的組識別碼*/dev_t st_rdev; /* device ID (if special file) 若此檔案為裝置裝置檔案, 則為其裝置編號*/off_t st_size; /* total size, in bytes 檔案大小, 以位元組計算*/blksize_t st_blksize; /* blocksize for file system I/O 檔案系統的I/O 緩衝區大小*/blkcnt_t st_blocks; /* number of 512B blocks allocated 佔用檔案區塊的個數, 每一區塊大小為512 個位元組*/time_t st_atime; /* time of last access 檔案最近一次被存取或被執行的時間*/time_t st_mtime; /* time of last modification 檔案最後一次被修改的時間*/time_t st_ctime; /* time of last status change 最近一次被更改的時間*/};
access函數
標頭檔:#include < unistd.h>
定義函數:int access(const char * pathname, int mode);
函數說明:access()會檢查是否可以讀/寫某一已存在的檔案。
參數mode 有幾種情況組合:
1、R_OK, W_OK, X_OK和F_OK. R_OK, W_OK 與X_OK 用來檢查檔案是否具有讀取寫入和執行的許可權。
2、F_OK 則是用來判斷該檔案是否存在。由於access()只作許可權的核查, 並不理會檔案形態或檔案內容,因此,如果一目錄表示為”可寫入”,表示可以在該目錄中建立新檔案等操作,而非意味此目錄可以被當做檔案處理。例如:你會發現DOS 的檔案都具有”可執行”許可權,但用execve()執行時則會失敗。
傳回值:若所有欲查核的許可權都通過了檢查則返回0 值,表示成功,只要有一許可權被禁止則返回-1。
錯誤碼:
1、EACCESS 參數pathname 所指定的檔案不符合所要求測試的許可權.
2、EROFS 欲測試寫入許可權的檔案存在於唯讀檔案系統內.
3、EFAULT 參數pathname 指標超出可存取記憶體空間.
4、EINVAL 參數mode 不正確.
5、ENAMETOOLONG 參數pathname 太長.
6、ENOTDIR 參數pathname 為一目錄.
7、ENOMEM 核心記憶體不足
8、ELOOP 參數pathname 有過多符號串連問題.
9、EIO I/O 存取錯誤.
#include <sys/types.h>#include <sys/stat.h>#include <time.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(int argc, char *argv[]){ //R_OK 是否有讀許可權 //W_OK 是否有寫入權限 //X_OK 是否有執行許可權 //F_OK 測試一個檔案是否存在 if(access("abc",F_OK) <0) { perror("abc"); exit(1); } printf("abc is ok\n"); return 0;}
檔案系統之 stat與access