【linux】open函数创建新文件及umask函数使用

首先我们来看一下open函数的原型

#include <fcntl.h>

int open(const char *path, int oflag,.../*mode_t mode*/);
                        //返回值:若成功,返回文件描述符;若失败,返回-1

由函数原型可知open函数有一个可变参数mode,当使用open函数创建新文件时,需选用常量O_CREAT为构成参数oflag的一部分,此时我们需要通过参数mode为新建的文件设置访问权限。

参数mode由下面9个文件访问权限位中的若干位相”或”构成。

st_mode含义
S_IRUSR用户读
S_IWUSR用户写
S_IXUSR用户执行
S_IRGRP组读
S_IWGRP组写
S_IXGRP组执行
S_IROTH其它读
S_IWOTH其它写
S_IXOTH其它执行

另外mode参数也可以通过一个3位8进制数来表示,例如:
S_IRUSR | S_IWUSR | S_IRGRP | S_IWOTH 可用八进制数 0642来表示
0642的二进制表示为 110 100 010 显然这个二进制数的后9位分别对应了 用户、组、其他 相应的 读、写、执行 权限

不过新建文件的访问权限并不是完全由mode参数决定的,而是要和文件模式创建屏蔽字umask经过如下计算来得到。

新的访问权限 = mode & (~umask)
文件模式创建屏蔽字umask

umask值用于控制用户所创建文件的默认权限,umask也是一个mode_t类型的值,它的每一位都代表一种要屏蔽的权限。每个进程都有自己的umask值,系统会自动为其设置一个值。通过shell的umask命令可以查看。
下面介绍umask函数,它可以为进程设置文件模式创建屏蔽字,并返回之前的值

#include <sys/stat.h>

mode_t umask(mode_t cmask); //cmask为要设置的新值

下面通过一段代码说明用open函数创建新文件的过程以及umask函数的使用

#include <sys/stat.h>
#include <fcntl.h>

#define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)

int main() 
{
    umask(0);
    open("file1", O_CREAT, RWRWRW);

    umask(0077); //屏蔽组和其它的所有权限
    open("file2", O_CREAT, RWRWRW);

    return 0;
}

shell下运行结果

$ umask
0002
$ ./a.out
$ ls -l file1 file2
-rw-rw-rw- 1 waiting waiting 0 1214 13:30 file1
-rw------- 1 waiting waiting 0 1214 13:30 file2
$ umask
0002

由以上的结果可以看出,修改进程的umask值并不会影响其父进程的umask值
并且如果想要新创建文件的访问权限完全由用户决定,那么只需在调用open函数前用umask函数将umask值置为0即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值