linux open函數的 mode_t涵義(轉)


打開文件、新建文件和關閉文件操作

打開文件操作使用系統調用函數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種操作。程序的邏輯為:指定一個路徑,如果該文件存在,輸出提示信息,關閉該文件;如果該文件不存在,則新建文件並設置文件屬性,輸出提示信息,然后關閉該文件。完整的代碼如下:

  1. #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.    const char *f_path = "test";             // 定義路徑字符串  
  10.    mode_t f_attrib;                         // 聲明mode_t
    型變量,保存文件屬性  
  11.    f_attrib = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;  
  12.                                             // 為umask變量賦值  
  13.    f = open(f_path, O_RDONLY);              // 以只讀方式打開文件  
  14.    if (f == -1) {                           // 判斷文件是否打開成功  
  15.       f =open(f_path, O_RDWR | O_CREAT, f_attrib);  // 創建新文件  
  16.       if (f != -1)                                  // 
    判斷文件創建是否成功  
  17.          puts("創建一個新文件");  
  18.       else {  
  19.          puts("無法創建新文件,程序退出");  
  20.          return 1;  
  21.       }  
  22.    }  
  23.    else  
  24.       puts("文件打開成功");  
  25.    close(f);                                            // 關閉文件  
  26.    return 0;  

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

 

                                                               

原文:http://book.51cto.com/art/200912/169537.htm

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM