本文主要介绍Unix文件访问权限的屏蔽和更改
文件访问权限
文件的 9 个访问权限位
| st_mode 屏蔽 | 意义 |
| S_IRUSR | 用户读 |
| S_IWUSR | 用户写 |
| S_IXUSR | 用户执行 |
| S_IRGRP | 组读 |
| S_IWGRP | 组写 |
| S_IXGRP | 组执行 |
| S_IROTH | 其他读 |
| S_IWOTH | 其他写 |
| S_IXOTH | 其他执行 |
新文件访问权限的屏蔽
umask函数为进程设置文件模式创建屏蔽字,并返回之前的值
#include <sys/stat.h> mode_t umask(mode_t cmask); //Returns: previous file mode creation mask
下面程序创建两个文件,创建第一个文件 foo 时将进程的文件模式创建屏蔽字清空,而创建第二个文件之前,则屏蔽了所有组和其他用户的读写权限。
#include <stdlib.h>
#include <stdio.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) {
printf("creat error for foo");
exit(-1);
}
umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if (creat("bar", RWRWRW) < 0) {
printf("creat error for bar");
exit(-1);
}
exit(0);
}
运行如下:
wu@ubuntu:~/opt/Cproject/apue/cp1$ gcc umasktest.c -o a.out
wu@ubuntu:~/opt/Cproject/apue/cp1$ umask
0002
wu@ubuntu:~/opt/Cproject/apue/cp1$ ./a.out
wu@ubuntu:~/opt/Cproject/apue/cp1$ ls -l foo bar
-rw——- 1 wu wu 0 Mar 8 01:48 bar
-rw-rw-rw- 1 wu wu 0 Mar 8 01:48 foo
wu@ubuntu:~/opt/Cproject/apue/cp1$ umask
0002
首先使用shell的umask命令在运行程序的前、后打印文件模式创建屏蔽字。由此可见,更改进程的文件模式创建屏蔽字并不影响其父进程(通常是shell)的屏蔽字
文件访问权限的更改
UNIX 提供了3个函数 chmod 、fchmod 、fchmodat实现对现有文件访问权限的更改。
#include <sys/stat.h> int chmod(const char *pathname, mode_t mode); int fchmod(int fd, mode_t mode); int fchmodat(int fd, const char *pathname, mode_t mode, int flag); //All three return: 0 if OK, −1 on error
chmod 函数在指定的文件上进行操作,而 fchmod 函数则对已打开的文件进行操作。
要改变一个文件的访问权限,进程的有效用户 ID 必须等于文件的所有者 ID,或者该进程必须具有超级用户权限。
参数 mode 是表中所示常量的某种按位或运算构成的。
| mode | 说明 |
| S_ISUID | 执行时设置用户 ID |
| S_ISGID | 执行时设置组 ID |
| S_IRWXU | 用户读、写和执行 |
| S_IRUSR | 用户 -读 |
| S_IWUSR | 用户 -写 |
| S_IXUSR | 用户 -执行 |
| S_IRWXG | 组读、写和执行 |
| S_IRGRP | 组 -读 |
| S_IWGRP | 组 -写 |
| S_IXGRP | 组 -执行 |
| S_IRWXO | 其他读、写和执行 |
| S_IROTH | 其他 -读 |
| S_IWOTH | 其他 -写 |
| S_IXOTH | 其他 -执行 |
下面程序打开了文件 foo 的设置组 ID 位、关闭了组执行位。而对于文件 bar 则强制设置为某个指定的访问权限。
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
int
main(void)
{
struct stat statbuf;
if (stat("foo", &statbuf) < 0) {
printf("stat error for foo");
exit(-1);
}
if (chmod("foo", (statbuf.st_mode & ~S_IXGRP) | S_ISGID) < 0) {
printf("chmod error for foo");
exit(-1);
}
if (chmod("bar", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) < 0) {
printf("chmod error for bar");
exit(-1);
}
exit(0);
}
编译运行上面的程序:
wu@ubuntu:~/opt/Cproject/apue/cp1$ gcc chmodtest.c -o a.out
wu@ubuntu:~/opt/Cproject/apue/cp1$ ls -l foo bar
-rw——- 1 wu wu 0 Mar 8 01:48 bar
-rw-rw-rw- 1 wu wu 0 Mar 8 01:48 foo
wu@ubuntu:~/opt/Cproject/apue/cp1$ ./a.out
wu@ubuntu:~/opt/Cproject/apue/cp1$ ls -l foo bar
-rw-r–r– 1 wu wu 0 Mar 8 01:48 bar
-rw-rwSrw- 1 wu wu 0 Mar 8 01:48 foo

Comments