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

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页