1. 什么是 umask?

当我们登录 Linux 系统之后创建文件总有一个默认权限,设置用户创建文件的默认权限就是 umask 所做的工作,与 chmod 效果不同,umask 设置权限通过设置”补码”。

因为 linux 系统中文件权限默认最大为 666,所以通过设置 umask 屏蔽掉一些权限。

2. 原理及计算说明

rk3288:/mnt # ls -al
-rw-rw-rw-  1 root   root       0 2018-07-24 05:09 a.txt

linux 系统可以有多个用户,多个用户可以属于同一个组,用户和组的概念就像我们人和家庭一样,人属于家庭的一分子,用户属于一个组。

一个文件的权限字符可以概括为:1个文件特殊权限 + 3组9个权限,3组9个权限分别为:当前用户可读、当前用户可写、当前用户可执行、组用户可读、组用户可写、组用户可执行、其他用户可读、其他用户可写、其他用户可执行。

rw-rw-rw- 用三个8进制数可表示为:666

第一个文件特殊权限,如果是文件的话为 - ,如果是目录的话为 d

2.1 chmod 设置

通过 chmod 可以直接设置文件的权限,对应 三组9个权限,如:

rk3288:/mnt # chmod 777 a.txt

rk3288:/mnt # ls -al a.txt
-rwxrwxrwx 1 root root 0 2018-07-24 05:09 a.txt
2.2 umask

umask 设置文件权限通过指定建立文件时预设的权限掩码来实现,我们知道,不能默认创建可执行文件,必须手工赋予执行权限,所以创建文件时默认为最大权限 666,但是实际的文件权限需要通过 umask 进行屏蔽之后显示。

文件默认最大权限为 666,而目录默认最大权限为 777

获取 umask 值

系统中的 umask 值可以通过 umask 命令获取:

rk3288:/mnt # umask
022

获取在代码中通过 umask 函数直接获取返回值

计算方法
实际权限 = max_permnishu & (~umask)

例如:umask 值为 022

则默认文件的权限为:
110 110 110 & (~000 010 010) = 110 110 110 & 111 101 101 = 110 100 100

即默认权限为:644

比较简单的一种理解方式为:
umask 值 022 为屏蔽组用户写权限、其它用户写权限,666 去掉组用户组写权限、其它用户写权限,即为 644

3. umask 函数

#include <sys/stat.h>

mode_t umask(mode_t cmask);

其中,cmask 是由下表列出的9个常量中的若干个按位”或”构成的

- S_IRUSR       当前用户可读
- S_IWUSR       当前用户可写
- S_IXUSR       当前用户可执行
- S_IRGRP       用户组可读
- S_IWGRP       用户组可写
- S_IXGRP       用户组可执行
- S_IROTH       其他用户可读
- S_IWOTH       其他用户可写
- S_IXOTH       其他用户可执行

umask 的主要作用是在创建文件时设置或者屏蔽掉文件的一些权限

如:

umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if (creat("bar", RWRWRW) < 0)
    err_sys("creat error for bar");

如上设置 cmask 的值为 066,屏蔽掉组用户和其他用户的读写权限,则 create 文件时剩余的权限为 600

Logo

更多推荐