1. 程式人生 > >C語言open()和creat()函皇冠數體育平臺出租創建文件時,文件權限設置相關

C語言open()和creat()函皇冠數體育平臺出租創建文件時,文件權限設置相關

linux c 編譯運行 函數 code 計算 urn 解決 情況 結果

皇冠體育平臺出租 haozbbs.com Q1446595067 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;
}

1
2
3
4
5
6
7
8
9
10
11
12
13

編譯和運行

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#

1
2
3
4
5
6
7
8

我們可以看到實際創建的 file.txt 文件權限為 -rwx r-x r-x,並且當前系統的 umask 值為 0022 。我們創建文件時,希望創建的文件權限為 0777 ,也就是-rwx rwx rwx。我們現在來驗證一下是否滿足mode & ~umask。

~umask即為umask 取反值為 1755
我們創建文件的 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;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14

編譯運行結果為

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#

1
2
3
4
5
6
7
8

從運行結果來看,代碼中使用umask()函數,並不會改變系統的umask值,只會臨時改變umask值。所以個人建議,我們使用open()和creat()時,在代碼上方加上一句umask(0000);,這樣我們在使用open()和creat()時,就不需要特別計算mode值了。

C語言open()和creat()函皇冠數體育平臺出租創建文件時,文件權限設置相關