天天看點

APUE:檔案和目錄(一)

檔案和目錄

stat函數

#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *pathname, struct stat *buf) ;
int fstat(int filedes,struct stat *buf) ;
int lstat(const char *pathname, struct stat *buf) ;
三個函數的傳回:若成功則為 0,若出錯則為-1
           

給定一個pathname,stat函數傳回一個與此命名檔案有關的資訊結構, fstat函數獲得已在描述符filedes上打開的檔案的有關資訊。lstat是在遇到符号連接配接時,傳回符号連接配接的有關資訊而不是符号連接配接引用的檔案資訊。

第二個參數是函數傳回的結構體,結構體如下

APUE:檔案和目錄(一)
APUE:檔案和目錄(一)

檔案類型

檔案類型有七種,分别為:

  1. 普通檔案
  2. 目錄檔案
  3. 字元特殊檔案。用于某些類型的裝置
  4. 塊特殊檔案,用于磁盤裝置
  5. FIFO,用于程序間通訊
  6. 套接字,用于程序間網絡通訊
  7. 符号連結,這種檔案指向另一個檔案

檔案類型在stat結構的st_mode成員中,可以用宏來判斷是什麼類型

設定-使用者-ID和設定-組-ID

APUE:檔案和目錄(一)
  • 實際使用者ID和實際組ID通常在會話期間不會改變,但是超級使用者可以改變。
  • 有效使用者ID,有效組ID以及添加組ID決定了我們的檔案通路權。
  • 儲存的設定-使用者-ID和設定-組-ID在執行一個程式時包含了有效使用者ID和有效組ID的副本。
  • 通常,有效使用者ID等于實際使用者ID,有效組ID等于實際組ID。
  • 可以在檔案方式字 (st_mode)中設定一個特殊标志來時有效使用者變為檔案的所有者(st_uid)。組同理。

檔案存取許可權

st_mode包含了對檔案的存取許可權位。

每個檔案包含9個存取許可權位。

APUE:檔案和目錄(一)
  • 打開一個檔案,這個檔案經過的所有目錄都應具有執行許可權。
  • 目錄的讀許可權表示可以讀目錄,獲得該目錄所有檔案名的清單,執行許可權表示可以通過這個目錄。
  • open函數中的标志必須對檔案有相應的權限才能使用成功。
  • 目錄建立檔案需要目錄有寫和執行許可權,删除同理且不需要被删除檔案有寫和執行許可權。
  • exec函數執行需要執行許可權
  • 如若程序擁有此檔案,則按使用者存取許可權準許或拒絕該程序對檔案的存取——不檢視組存取許可權。相類似,若程序并不擁有該檔案。但程序屬于某個适當的組,則按組存取許可權準許或拒絕該程序對檔案的存取——不檢視其他使用者的存取許可權。

access函數

# include<unistd.h>
int access(const char *pathname, int mode) ;
傳回:若成功則為0,若出錯則為-1
           

access函數是按實際使用者ID和實際組ID進行存取許可權測試的。

APUE:檔案和目錄(一)

umask函數

設定程序屏蔽關鍵字,設定屏蔽關鍵字後,open或creat相應的許可位就被屏蔽了

#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t cmask) ;
傳回:以前的檔案方式建立屏蔽字
           

chmod和fchmod函數

#include <sys/types.h>
#include <sys/stat.h>
int chmod(const char * pathname, mode_t mode) ;
int fchmod(int filedes, mode_t mode) ;
兩個函數傳回:若成功則為0,若出錯則為-1
           

chmod函數在指定的檔案上進行操作,而fchmod函數則對已打開的檔案進行操作。

為了改變一個檔案的許可權位,程序的有效使用者 I D必須等于檔案的所有者,或者該程序必

須具有超級使用者許可權。

APUE:檔案和目錄(一)
APUE:檔案和目錄(一)

程式4.4有點沒看懂

粘住位

如果對一個目錄設定了粘住位,則隻有對該目錄具有寫許可權的使用者并且滿足下列條件之一,才能删除或更名該目錄下的檔案:

  • 擁有此檔案。
  • 擁有此目錄。
  • 是超級使用者。

chown, fchown和lchown函數

chown函數可用于更改檔案的使用者ID群組ID。

#include <sys/types.h>
#include <unistd.h>
int chown(const char *pathname, uid_t owner, gid_t group) ;
int fchown(int filedes, uid_t owner, gid_t group) ;
int lchown(const char *pathname, uid_t owner, gid_t group) ;
三個函數傳回:若成功則為 0,若出錯則為-1
           

這個函數與stat類似

  • 隻有超級使用者程序能更改該檔案的使用者ID。
  • 若滿足下列條件,一個非超級使用者程序可以更改該檔案的組ID:

    (a) 程序擁有此檔案(其有效使用者ID等于該檔案的使用者ID)。

    (b) 參數owner等于檔案的使用者ID,參數group等于程序的有效組ID或程序的添加組ID之一。

檔案長度

stat結構的成員st_size包含了以位元組為機關的該檔案的長度。

檔案截短

#include <sys/types.h>
#include <unistd.h>
int truncate(const char *pathname, off_t length) ;
int ftruncate(int filedes, off_t length);
兩個函數傳回;若成功則為 0,若出錯則為-1
           

如果以前的長度短于length,則其後果與系統有關。如果某個實作的處理是擴充該檔案,則在以前的檔案尾端和新的檔案尾端之間的資料将讀作0 (也就是在檔案中建立了一個空洞)。

繼續閱讀