1. 程式人生 > >C語言open()和creat()函式建立檔案時,檔案許可權設定相關

C語言open()和creat()函式建立檔案時,檔案許可權設定相關

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 75 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

即為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;
}

編譯執行結果為

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 75 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值了。