UNIX檔案mode t詳解
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
開啟檔案、新建檔案和關閉檔案操作
開啟檔案操作使用系統呼叫函式open(),該函式的作用是建立一個檔案描述符,其他的函式可以通過檔案描述符對指定檔案進行讀取與寫入的操作。開啟檔案的一般形式是:
- 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副標誌實現的。當路徑中的檔案不存在時,則建立一個新檔案。建立新檔案的同時可設定檔案的許可權,這時函式需要增加一組實際引數,形式為:
- 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(),該函式的一般形式是:
- creat(路徑, umask);
當檔案被成功建立函式的返回值為0,否則為-1。當檔案不需要使用了,則可以使用close()函式關閉檔案。關閉檔案的一般形式為:close(檔案描述符),如果關閉檔案成功,close()函式的返回0,否則返回-1。
下例將演示開啟檔案、新建檔案和關閉檔案這3種操作。程式的邏輯為:指定一個路徑,如果該檔案存在,輸出提示資訊,關閉該檔案;如果該檔案不存在,則新建檔案並設定檔案屬性,輸出提示資訊,然後關閉該檔案。完整的程式碼如下:
#include <fcntl.h> // 提供open()函式 #include <sys/types.h> // 提供mode_t型別 #include <sys/stat.h> // 提供open()函式的符號 #include <unistd.h> // 提供close()函式 #include <stdio.h> int main() { int f; // 宣告變數f,用於儲存檔案識別符號 const char *f_path = "test"; // 定義路徑字串 mode_t f_attrib; // 宣告mode_t型變數,儲存檔案屬性 f_attrib = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH; // 為umask變數賦值 f = open(f_path, O_RDONLY); // 以只讀方式開啟檔案 if (f == -1) { // 判斷檔案是否開啟成功 f =open(f_path, O_RDWR | O_CREAT, f_attrib); // 建立新檔案 if (f != -1) // 判斷檔案建立是否成功 puts("建立一個新檔案"); else { puts("無法建立新檔案,程式退出"); return 1; } } else puts("檔案開啟成功"); close(f); // 關閉檔案 return 0; }
該程式首先判斷是否存在檔案test,判斷的方法是用open()函式開啟test檔案,如果返回值是-1,則表示該檔案不存在(有時候並非如此)。當檔案不存在時,使用open()函式建立該檔案,並在程式最後關閉。為mode_t型變數f_attrib賦值的方法使用了按位計算操作,將表示檔案許可權的常量進行按位或計算,計算的結果與八進位制數0664相同,如圖13.3所示。
注:這篇文章來自部落格園一博主的貢獻,感謝博主的分享