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

  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值