我正在使用umask()
系統呼叫來設定檔案權限。我正在使用以下程式碼:
umask(S_IWGRP | S_IWOTH);
printf("Enter file name that you want to create:");
scanf(" %s",file);
fd = open(file,O_CREAT|O_WRONLY);
但執行後,將使用以下給定的權限建立文件
--wS-----T 1 rvi rvi 0 Oct 2 15:20 test.txt
S
這一點點是T
做什麼用的?為什麼它會自動修改?
答案1
當您使用 O_CREAT 呼叫 open 時,它需要第三個參數來表示檔案的模式。然後,umask 將從您要求的模式中封鎖掉。因此,例如:
umask(S_IWGRP | S_IWOTH /* == 0022 */);
fd = open(file, O_CREAT|O_WRONLY, 0777);
將建立一個帶有標誌 0777 & (~0022) = 0755 的文件,即 rwxr-xr-x,而:
umask(S_IWGRP | S_IWOTH);
fd = open(file, O_CREAT|O_WRONLY, 0666);
將建立一個帶有標誌 0666 & (~0022) = 0644 的文件,即 rw-r--r--。在您的情況下,因為您沒有提供模式參數,所以 open 函數會從堆疊中取出隨機數據,因此您唯一知道的是用 umask 屏蔽的位元將被關閉。嘗試向公開呼叫提供您想要的模式; 0777 是可執行檔的不錯選擇,0666 是非可執行檔的不錯選擇。