C語言open()和creat()函式建立檔案時,檔案許可權設定相關
阿新 • • 發佈:2018-12-17
open()和creat()建立檔案時,檔案許可權說明
首先了解一下 umask 命令,該命令用來設定限制新檔案許可權的掩碼。當新檔案被建立時,其最初的許可權由檔案建立掩碼決定。簡單地來說,umask和open()及creat()函式的許可權碼(mode_t mode引數)共同決定你的新建檔案的許可權。具體關係為mode & ~umask。
下面通過簡單的程式來驗證它們之間的關係。
Linux C
由於open()和creat()建立檔案,結果一致,我們直接採用creat()函式:
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
int main()
{
if( creat("/aicamel/boa/file.txt",0777) < 0 ) {
printf("檔案建立失敗!\n");
} else {
printf("檔案建立成功!\n");
}
return 0;
}
編譯和執行
root@aicamel-machine:/aicamel/boa# gcc -o test test.c
root@aicamel-machine:/aicamel/boa# ./test
檔案建立成功!
root@aicamel -machine:/aicamel/boa# ls -l file.txt
-rwxr-xr-x 1 root root 0 7月 5 09:24 file.txt
root@aicamel-machine:/aicamel/boa# umask
0022
root@aicamel-machine:/aicamel/boa#
我們可以看到實際建立的 file.txt 檔案許可權為 -rwx r-x r-x,並且當前系統的 umask 值為 0022 。我們建立檔案時,希望建立的檔案許可權為 0777 ,也就是-rwx rwx rwx。我們現在來驗證一下是否滿足mode & ~umask。
~umask
我們建立檔案的 mode 值為 0777
mode & ~umask 為 0755,也就是-rwx r-x r-x,與實際建立的檔案許可權一致。
看到這你應該知道怎麼一回事了,但是如果我們的程式執行在ARM開發板上時,有時會出現umask值同樣為0022,mode值同樣為0777,當創建出的檔案許可權始終為-rw- - - - - - -,無論我們如何修改umask值和mode值,創建出的檔案許可權始終不變,如果遇到這種情況,我們需要使用umask()函式,即可解決這個問題。
使用umask()函式
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
int main()
{
umask(0000); //將umask值設定為0000,實際建立的檔案許可權即為下面的mode值
if( creat("/aicamel/boa/file.txt",0777) < 0 ) {
printf("檔案建立失敗!\n");
} else {
printf("檔案建立成功!\n");
}
return 0;
}
編譯執行結果為
root@aicamel-machine:/aicamel/boa# gcc -o test test.c
root@aicamel-machine:/aicamel/boa# ./test
檔案建立成功!
root@aicamel-machine:/aicamel/boa# ls -l file.txt
-rwxrwxrwx 1 root root 0 7月 5 09:51 file.txt
root@aicamel-machine:/aicamel/boa# umask
0022
root@aicamel-machine:/aicamel/boa#
從執行結果來看,程式碼中使用umask()函式,並不會改變系統的umask值,只會臨時改變umask值。所以個人建議,我們使用open()和creat()時,在程式碼上方加上一句umask(0000);,這樣我們在使用open()和creat()時,就不需要特別計算mode值了。