每个程序有六个或者更多的ID和它相关。a.real user ID和real group ID证明我们是谁。这两项是从我们登陆时的密码文件里面获取的。通常,这些值不会改变在登陆过程中,虽然超级用户的进程有方式改变它们。b.effective user ID,effective group ID,和supplementary group ID决定我们的访问权限。c.save set-user-ID和saved set-group-ID是在程序执行时由effective user ID和effective group ID拷贝的。 通常,effective user ID等于real user ID,并且effective group ID等于real group ID。 每个文件都有自己的所有者(an owner)和组所有者(a group owner)。所有者定义在stat结构体里面的st_uid成员中,组所有者定义在st_gid成员中。 当我们执行一个程序文件时,程序effective user ID通常是real user ID,effective group ID是real group ID。但是我们也能够设置一个特殊标志在文件模式(st_mode)中。当改标志被设置了之后,当文件被执行时,effective user ID时文件所有者(st_uid)。同样的我们也可以设置另一个位是的effective group ID等于文件组所有者(st_gid)。这两位叫做set-user-ID 位和set-group-ID位。这两位能够被单独检测通过常量S_ISUID和S_ISGID,从而判断标志是否被置位。
3.文件访问权限
stat结构体中的st_mode参数也包含了文件的访问权限。每个文件都有九种访问权限,分为三类。如图 前三行user项是指文件所有者。chmod命令通常改变的就是这九个权限位,允许我们定义u为用户(user),g为组(group),o为 其它(other)。文件访问权限测试内核执行打开,创建或者删除文件时依赖于文件所有者(st_uid,st_gid),有效用户ID(effective user ID, effective group ID),和其它组ID。两个所有者ID时文件属性,两个有效ID是进程述属性。1.如果有效用户ID是0(超级用户),访问被允许。整个文件系统都可以被访问。2.如果有效用户ID等于文件所有者ID,如果有效位被设置了,访问是被允许的。不然是不允许的。比如程序打开文件读取数据,那么user-read bit必须设置。3.如果有效组ID或者额外组ID等于文件组ID,如果有效位被设置了,访问是被允许的。4.如果其它访问权限被设置了,访问是被允许的。 上面四个步骤按顺序尝试。