if(open(argv[1], O_RDONLY)< 0)
err_ret("open error for %s", argv[1]); else printf("open for reading OK\n");
exit(0); }
上面代码中使用了access和open两个系统调用,open打开一个函数时,内核以有效用户id和有效组id来测试文件存取许可权,而access则以实际用户id和实际组id来测试存取许可权。
$ ls -l a.out
-rwxrwxr-x 1 stevens 105216 Jan 18 08:48 a.out 上面命令显示a.out文件对所有者和所有组具有读写执行,而且没有设置 设置-用户-ID。
$ a.out a.out
read access OK
open for reading OK 此时,有效用户ID等于实际用户ID,即stevens。实际用户和有效用户都可访问。
$ ls -1 a.out 检查所有者和SUID位 -rwsrwxr-x 1 uucp 105216 Jan 18 08:48 a.out a.out的所有者变成了uucp,并且设置了 设置-用户-ID位
# exit 回到正常stevens用户
$ a.out /etc/uucp/Systems access error for /etc/uucp/Systems: Permission denied open for reading OK 此时,open以有效用户身份探测存取许可权,因为设置了 设置-用户-ID位,有效用户变成了文件的所有者uucp,因此open能够读取文件。而access是以实际用户身份测试,实际用户为stevens,因此access测试失败!