文件访问权限
每个文件有9个访问权限位,可将它们分为3类:
st_mode屏蔽 | 含义 |
S_IRUSR S_IWUSR S_IXUSR | 用户读 用户写 用户执行 |
S_IRGRP S_IWGRP S_IXGRP | 组读 组写 组执行 |
S_IROTH S_IWOTH S_IXOTH | 其他读 其他写 其他执行 |
函数umask
umask函数为进程设置文件模式创建屏蔽字,并返回之前的值。
#include <sys/wait.h>
mode_t umask(mode_t cmask);
返回值:之前的文件模式创建屏蔽字
其中,参数cmask是由表格中的9个常量中的若干个按位“或”构成的。
在进程创建一个新文件或者新目录时,就一定会使用文件模式创建屏蔽字。在文件模式创建屏蔽字中为1的位,在文件mode中的相应位一定被关闭。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
int main(void)
{
umask(0);
if (creat("foo", RWRWRW) < 0)
{
perror("create error for foo");
exit(1);
}
umask(S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
if (creat("bar", RWRWRW) < 0)
{
perror("create error for bar");
exit(1);
}
exit(0);
}
mali@mali:~/code/file_dir$ umask
0002
mali@mali:~/code/file_dir$ gcc umask.c -o umask
mali@mali:~/code/file_dir$ ./umask
mali@mali:~/code/file_dir$ ls -l
total 16
-rw------- 1 mali mali 0 8月 13 21:48 bar
-rw-rw-rw- 1 mali mali 0 8月 13 21:48 foo
-rwxrwxr-x 1 mali mali 8760 8月 13 21:48 umask
-rw-rw-r-- 1 mali mali 466 8月 13 21:47 umask.c
mali@mali:~/code/file_dir$ umask
0002
mali@mali:~/code/file_dir$
在该示例中,我们用shell的umask命令在运行程序的前后打印文件模式创建屏蔽字。从中可见,更改进程的文件模式创建屏蔽字并不影响其父进程的屏蔽字。
用户可以设置umask值控制他们所创建文件的默认权限。该值表示成八进制数,一位代表一种要屏蔽的权限。设置了相应位后,它所对应的权限就会被拒绝。常用的几种umask值是002、022和027。002阻止其他用户写入你的文件,022阻止同组成员和其他用户写入你的文件,027阻止同组成员写你的文件以及其他用户读、写或执行你的文件。
屏蔽位 | 含义 |
0400 | 用户读 |
0200 | 用户写 |
0100 | 用户执行 |
0040 | 组读 |
0020 | 组写 |
0010 | 组执行 |
0004 | 其他读 |
0002 | 其他写 |
0001 | 其他执行 |
mali@mali:~/code/file_dir$ umask
0002
mali@mali:~/code/file_dir$ umask -S
u=rwx,g=rwx,o=rx
mali@mali:~/code/file_dir$ umask 027
mali@mali:~/code/file_dir$ umask -S
u=rwx,g=rx,o=
mali@mali:~/code/file_dir$ umask 022
mali@mali:~/code/file_dir$ umask -S
u=rwx,g=rx,o=rx
mali@mali:~/code/file_dir$