4.2stat、fstat和lstat函數
#include <sys/stat.h> int stat(const char *restrict pathname, struct stat *restrict buf); int fstat(int filedes, struct stat *buf); int lstat(const char *restrict pathname, struct stat *restrict buf); 三個函數的返回值:若成功則返回0,若出錯則返回-1
- 一旦給pathname,stat函數就返回與此命名文件有關的信息結構。fstat函數獲取已在描述符filedes上打開文件的有關信息。lstat函數類似於stat,但是當命名文件是一個符號鏈接時,lstat返回該符號鏈接的有關信息,而不是該符號鏈接引用文件的信息。
struct stat { mode_t st_mode; /* file type & mode (permissions) */ ino_t st_ino; dev_t st_dev; dev_t st_rdev; nlink_t st_nlink; uid_t st_uid; gid_t st_gid; off_t st_size; time_t st_atime; time_t st_mtime; time_t st_ctime; blksize_t st_blksize; blkcnt_t st_blocks; };
4.3文件類型
- 文件類型包括以下幾種:
- 普通文件。
- 目錄文件。這種文件包含了其他文件的名字以及指向這些文件有關信息的指針。
- 塊特殊文件。這種文件類型提供對設備(例如磁盤)帶緩衝的訪問,每次訪問以固定長度爲單位進行。
- 字符特殊文件。這種文件類型提供對這杯不帶緩衝的訪問,每次訪問長度可變。
- FIFO。用於進程間通信。
- 套接字。用於進程間的網絡通信。
- 符號鏈接。
- 文件的類型信息包含在stat結構的st_mode成員中。可以用表4-1中的宏確定文件類型。這些宏的參數都是stat結構中的st_mode成員。
表4-1中的文件類型宏 宏 文件類型 S_ISREG() 普通文件 S_ISDIR() 目錄文件 S_ISCHR() 字符特殊文件 S_ISBLK() 塊特殊文件 S_ISFIFO() 管道或FIFO S_ISLNK() 符號鏈接 S_ISSOCK() 套接字
- 表4-2中的宏可用來確定IPC對象的類型,這些宏的參數並非st_mode,而是指向stat結構的指針。
表4-2中的IPC類型宏 宏 對象類型 S_TYPEISMQ() 消息隊列 S_TYPEISSEM() 信號量 S_TYPEISSHM() 共享存儲對象
4.4設置用戶ID和設置組ID
- 與一個進程相關的ID有6個或更多,他們示於表4-4中
表4-4與每個進程相關的用戶ID和組ID 實際用戶ID 我們實際上是誰
實際組ID有效用戶ID 用於文件訪問權限檢查
有效組ID
附加組ID保存的設置用戶ID 由exec函數保存
保存的設置組ID - 每個文件都有一個所有者和組所有者,所有者由stat結構中的st_uid成員表示,組所有者則有st_gid成員表示。
- 在文件模式字(st_mode)中設置一個特殊標誌,其含義是“當執行此文件時,將進程的有效用戶ID設置爲文件所有者的用戶ID(st_uid)”。與此類似,在文件模式字中可以設置另一位,它使得將執行此文件的進程的有效組ID設置爲文件的組所有者ID(st_gid)。在文件模式字中的這兩位被稱爲設置用戶ID(set-usr-ID)位和設置組ID(set-group-ID)位。這兩位可用常量S_ISUID和S_ISGID測試。
4.5文件訪問權限
-
表4-5 9個訪問權限位,取自 st_mode屏蔽 意義 S_IRUSR
S_IWUSR
S_IXUSR用戶-讀
用戶-寫
用戶-執行S_IRGRP
S_IWGRP
S_IXGRP組-讀
組-寫
組-執行S_IROTH
S_IWOTH
S_IXOTH其他-讀
其他-寫
其他-執行 - 對於目錄的讀權限和執行權限的意義是不相同的。讀權限允許我們讀目錄,獲得在該目錄中所有文件名的列表。當一個目錄是我們要訪問文件的路徑名的一個組成部分時,對該目錄的執行權限是我們可以通過該目錄(也就是搜索該目錄,尋找一個特定的文件名)。
4.6新文件和目錄的所有權
- 新目錄的所有全和新文件的所有權規則相同。
- 新文件的用戶ID設置爲進程有效用戶ID。關於組ID,POSIX.1允許實現選擇下列之一作爲新文件的組ID。
- 新文件的組ID可以是進程的有效組ID。
- 新文件的組ID可以是它所在目錄的組ID。(在linux中如設置了set-group-ID位時,使用第二步)。