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);
}
其实就是做个减法操作,创建目录权限 - 掩码权限 = 最终需要的权限:
- 0700 - 0300 = 0400 二进制:100 000 000 (每三个是一组,代表八进制位一个数位)
- 程序中的处理过程也类似,先将掩码按位取反,然后再与设定的值按位与运算得到最终的权限:
- 掩码八进制:0 300 转为二进制:011 000 000
- 设定权限值:0 700 转为二进制:111 000 000
- 将二进制按位取反:~011 000 000 = 100 111 111
- 与设定权限值二进制做按位与: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的读写权限,虽然也应该取消执行权限,但是由于本身就没有,所以就不用了。
浙公网安备 33010602011771号