判斷/home下有沒有文件aaa.txt,如果存在則提示錯誤,如果文件不存在則創建且文件最終權限爲644。
#include<stdio.h> #include<fcntl.h> int main(void){ int fd; fd = open("/home/aaa.txt",O_WRONLY | O_CREAT | O_EXCL,0666); if (fd == -1) printf ("Error: File exists.\n" ); }
例子的代碼比較簡單,但是有幾個地方需要說明,一個文件的權限是受到open函數參數給定(代碼是0666)和umask值同時影響的,0666-0022=0644(更準確的方法是使用“與運算”獲得權限)
當前爲root用戶umask是0022,在當前shell下啓的進程都是會繼承當前的umask值,包括make,gcc和touch命令的進程,爲了直觀用stat查看,兩個文件分別是之前make編譯出的aaa.txt和touch創建的bbb.txt,默認權限都是644
如果需要使創建的文件權限爲代碼參數中指定的權限,那麼只要把umask設置爲0
總結:1.進程具有繼承權限的特點。
2.一個文件的權限是受到open函數的參數和當前shell的umask值共同影響的。
也許會有人要問,touch命令會用到open函數了嗎?那麼strace下看看,很明顯的結果,默認是0666減去umask的權限。