umask

umask,从字面意思上来讲就是去掉一些掩码,我们知道文件权限是由掩码表示的,去掉一些掩码就是去掉一些权限。

linux系统调用umask

函数原型:mode_t umask(mode_t mask)

mask:八进制位掩码值

return: 返回上一次的掩码值,没有失败只有成功。

如Qt在程序工作路径创建一个"123456"的目录,期望目录只有读的权限。

void createDir()
{
    QString dir = QCoreApplication::applicationDirPath();
    dir += "/123456";
    umask(0300);
    mkdir(dir.toStdString().data(), 0700);

}

其实就是做个减法操作,创建目录权限  - 掩码权限 = 最终需要的权限:

  1. 0700 - 0300 = 0400   二进制:100 000 000 (每三个是一组,代表八进制位一个数位)
  2. 程序中的处理过程也类似,先将掩码按位取反,然后再与设定的值按位与运算得到最终的权限:
  3. 掩码八进制:0 300  转为二进制:011 000 000
  4. 设定权限值:0 700 转为二进制:111 000 000
  5. 将二进制按位取反:~011 000 000 = 100 111 111
  6. 与设定权限值二进制做按位与:111 000 000 & 100 111 111 = 100 000 000 即八进制:0400

实现目的:400的二进制表示

0100 - 000 - 000 = r-- --- ---

例子

#include"apue.h"
#include<fcntl.h>
#define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
int main(int argc, char** argv)
{
    umask(0);
    if(creat("foo",RWRWRW)<0)
        err_sys("creat error for foo");
    umask(S_IRUSR|S_IWUSR|S_IXUSR|S_IROTH|S_IWOTH);
    if(creat("bar",RWRWRW)<0)
        err_sys("creat error for bar");
    exit(0);
}

编译执行后用ls -l命令查看文件属性

m@ubuntu:~/test$ ls -l
----rw---- 1 m m     0 Jul  1 02:14 bar
-rw-rw-rw- 1 m m     0 Jul  1 02:14 foo

可见,bar相较于foo少了用户和other的读写权限,虽然也应该取消执行权限,但是由于本身就没有,所以就不用了。

posted on 2021-07-01 17:20  tur  阅读(199)  评论(0)    收藏  举报

导航