设置用户ID和设置组ID
与一个进程相关联的ID有6个或更多,它们如下所示:
实际用户(组)ID ——我们实际上是谁
有效用户(组)ID、附加组ID——用于文件访问权限的检查
保存的设置用户(组)ID——有exec函数保存
UNIX的文件访问权限是一个比较难理解的问题,我在这里用一个例子来说明。passwd程序是用于修改用户密码的,当然它的所有者是root的,但是为什么我们能用它来修改自己的密码哪?原因很简单。root程序设置了用户(组)ID,这样使得每个执行root程序的用户都暂时变成了root。实际上我们还是远来的用户,只是因为设置用户I(组)ID使得我们能够用文件所有者的权限来执行程序。而有效用户(组)ID是我们正在用什么身份执行程序,这是一个随具体情况二改变的ID。附加组ID则是文件可能属于多个组造成的。
有效用户(组)ID、附加组ID可用S_ISUID,S_ISGID来进行测试。
文件访问权限
文件访问权限一共有9种:
st_mode屏蔽字 意义
S_IRUSR 用户——读
S_IWUSR 用户——写
S_IXUSR 用户——执行
S_IRGRP 组——读
S_IWGRP 组——写
S_IXGRP 组——执行
S_IROTH 其他——读
S_IWOTH 其他——写
S_IXOTH 其他——执行
特别注意:但我们操作文件时隐藏着我们对包含该文件的所有目录的执行权限。也就是说如果我们对某个目录没有执行权限,则我们就可能不能做相应的操作。
新文件的用户ID设置为进程的有效用户ID。关于组ID允许有两种选择:
(1)进程的有效组ID (2)文件所在目录的组ID
access函数
access函数式按实际用户ID和实际组ID进行访问权的测试的。
#include<unistd.h>
int access(const char *pathname,int mode);
返回值:若成功则返回0,否则出错则返回-1.
mode是以下所列常量的按位或。
mode 说明
R_OK 测试读权限
W_OK 测试写权限
X_OK 测试执行权限
F_OK 测试文件是否存在
umask函数
umask函数为进程设置文件模式屏蔽字,并返回以前的值。(这是少数几个没有出错返回的函数)
#include<sys/stat.h>
mode_t umask(mode_t cmask);
返回值:以前的文件模式创建屏蔽字