Linux C代碼分析文件權限

判斷/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" );
}

wKioL1PV7zuAGuCJAACOo532xvg444.jpg

例子的代碼比較簡單,但是有幾個地方需要說明,一個文件的權限是受到open函數參數給定(代碼是0666)和umask值同時影響的,0666-0022=0644(更準確的方法是使用“與運算”獲得權限)

wKiom1PV7rbgSKYfAAAX_n3M3Fw732.jpg

當前爲root用戶umask是0022,在當前shell下啓的進程都是會繼承當前的umask值,包括make,gcc和touch命令的進程,爲了直觀用stat查看,兩個文件分別是之前make編譯出的aaa.txt和touch創建的bbb.txt,默認權限都是644

wKiom1PV8E7gowBxAABU9F_xssM629.jpg

如果需要使創建的文件權限爲代碼參數中指定的權限,那麼只要把umask設置爲0

wKioL1PV88HxM2ugAACPrMG_418776.jpg

總結:1.進程具有繼承權限的特點。

            2.一個文件的權限是受到open函數的參數和當前shell的umask值共同影響的。

也許會有人要問,touch命令會用到open函數了嗎?那麼strace下看看,很明顯的結果,默認是0666減去umask的權限。

wKiom1PV9CvShayAAAI-IlFe07A971.jpg 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章