1. 程式人生 > >UNIX檔案mode_t詳解 ... S_IRUSR

UNIX檔案mode_t詳解 ... S_IRUSR

開啟檔案、新建檔案和關閉檔案操作

開啟檔案操作使用系統呼叫函式open(),該函式的作用是建立一個檔案描述符,其他的函式可以通過檔案描述符對指定檔案進行讀取與寫入的操作。開啟檔案的一般形式是:

  1. open(檔案路徑, 標誌); 

函式的返回值是檔案描述符,如果開啟檔案成功返回一個正整數,否則返回-1。標誌是用於指定開啟檔案操作模式的列舉常量,主標誌如表13.1所示。

表13.1  開啟檔案操作的主標誌

參    數

說    明

參    數

說    明

O_RDONLY

以只讀方式開啟檔案

O_RDWR

以可讀寫方式開啟檔案

O_WRONLY

以只寫方式開啟檔案

 

 


主標誌是互斥的,使用其中一種則不能再使用另外一種。除了主標誌以外,還有副標誌可與它們配合使用,副標誌可同時使用多個,使用時在主標誌和副標誌之間加入按位與(|)運算子,如表13.2所示。

表13.2  開啟檔案操作的副標誌

參    數

說    明

O_APPEND

讀寫檔案從檔案尾部開始移動,所寫入

的資料追加到檔案尾

O_TRUNC

若檔案存在並且以可寫的方式開啟時,

此標誌會將檔案長度清為0,而原來存於

該檔案的資料也會消失

O_CREAT

若路徑中的檔案不存在則自動建立該檔案

O_EXCL

如果與O_CREAT同時設定,此指令會去檢

查檔案是否存在,檔案若不存在則建立該文

件,否則將導致開啟檔案錯誤。此外,若

O_CREAT與O_EXCL同時設定,並且將要

開啟的檔案為符號連線,則將導致開啟檔案失敗


新建檔案操作是在開啟檔案操作的函式上加入O_CREAT副標誌實現的。當路徑中的檔案不存在時,則建立一個新檔案。建立新檔案的同時可設定檔案的許可權,這時函式需要增加一組實際引數,形式為:

  1. open(檔案路徑, 標誌, 許可權標誌); 

檔案許可權標誌如表13.3所示。

表13.3  檔案許可權標誌

參    數

說    明

參    數

說    明

S_IRUSR

所有者擁有

讀許可權

S_IXGRP

群組擁有執

行許可權

S_IWUSR

所有者擁有

寫許可權

S_IROTH

其他使用者擁

有讀許可權

S_IXUSR

所有者擁有

執行許可權

S_IWOTH

其他使用者擁

有寫許可權

S_IRGRP

群組擁有讀許可權

S_IXOTH

其他使用者擁

有執行許可權

S_IWGRP

群組擁有寫許可權

 

 


檔案許可權標誌也可以使用加權數字表示,這組數字被稱為umask變數,它的型別是mode_t,是一個無符號八進位制數。umask變數的定義方法如表13.4所示。umask變數由3位數字組成,數字的每一位代表一類許可權。使用者所獲得的許可權是加權數值的總和。例如764表示所有者擁有讀、寫和執行許可權,群組擁有讀和寫許可權,其他使用者擁有讀許可權。

表13.4  umask變量表示方法

加 權 數 值

第1位

第2位

第3位

4

所有者擁有

讀許可權

群組擁有讀許可權

其他使用者擁

有讀許可權

2

所有者擁有

寫許可權

群組擁有寫許可權

其他使用者擁

有寫許可權

1

所有者擁有

執行許可權

群組擁有執行許可權

其他使用者擁

有執行許可權

新建檔案的另一個函式是creat(),該函式的一般形式是:

  1. creat(路徑, umask); 

當檔案被成功建立函式的返回值為0,否則為-1。當檔案不需要使用了,則可以使用close()函式關閉檔案。關閉檔案的一般形式為:close(檔案描述符),如果關閉檔案成功,close()函式的返回0,否則返回-1。

下例將演示開啟檔案、新建檔案和關閉檔案這3種操作。程式的邏輯為:指定一個路徑,如果該檔案存在,輸出提示資訊,關閉該檔案;如果該檔案不存在,則新建檔案並設定檔案屬性,輸出提示資訊,然後關閉該檔案。完整的程式碼如下:

[cpp]  view plain  copy    print?
  1. <span style="font-size:18px;"><strong>#include <fcntl.h>                          // 提供open()函式    
  2. #include <sys/types.h>                      // 提供mode_t型別    
  3. #include <sys/stat.h>                       // 提供open()函式的符號    
  4. #include <unistd.h>                         // 提供close()函式    
  5. #include <stdio.h>   
  6. int main()    
  7. {    
  8.    int f;                                   // 宣告變數f,  
  9. 用於儲存檔案識別符號    
  10.    const char *f_path = "test";             // 定義路徑字串    
  11.    mode_t f_attrib;                         // 宣告mode_t  
  12. 型變數,儲存檔案屬性    
  13.    f_attrib = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;    
  14.                                             // 為umask變數賦值    
  15.    f = open(f_path, O_RDONLY);              // 以只讀方式開啟檔案    
  16.    if (f == -1) {                           // 判斷檔案是否開啟成功    
  17.       f =open(f_path, O_RDWR | O_CREAT, f_attrib);  // 建立新檔案    
  18.       if (f != -1)                                  //   
  19. 判斷檔案建立是否成功    
  20.          puts("建立一個新檔案");    
  21.       else {    
  22.          puts("無法建立新檔案,程式退出");    
  23.          return 1;    
  24.       }    
  25.    }    
  26.    else    
  27.       puts("檔案開啟成功");    
  28.    close(f);                                            // 關閉檔案    
  29.    return 0;    
  30. } </strong></span>  

 

該程式首先判斷是否存在檔案test,判斷的方法是用open()函式開啟test檔案,如果返回值是-1,則表示該檔案不存在(有時候並非如此)。當檔案不存在時,使用open()函式建立該檔案,並在程式最後關閉。為mode_t型變數f_attrib賦值的方法使用了按位計算操作,將表示檔案許可權的常量進行按位或計算,計算的結果與八進位制數0664相同,如圖13.3所示。

 

                                                               

 

注:這篇文章來自部落格園一博主的貢獻,感謝博主的分享