在unix高级环境编程中有个4-2 程序,这里写一下自己的理解:
程序如下:
-
#include <sys/types.h>
-
#include <fcntl.h>
-
#include "ourhdr.h"
-
-
-
int main(int argc , char* argv[])
-
{
-
if (argc != 2)
-
err_quit("usage: a.out");
-
if(access(argv[1] , R_OK) < 0)
-
err_ret("access error for %s",argv[1]);
-
else
-
printf("read access OK\n");
-
if(open(argv[1] , O_RDONLY) < 0)
-
err_ret("open error for %s" , argv[1]);
-
else
-
printf("open for reading OK\n");
-
exit(0);
-
}
下面该程序的一些运行结果:
$ ls -l a.out
-rwxrwxr-x 1 stevens 105216 Jan 18 08:48 a.out
$ a.out a.out
read access OK
open for reading OK
**上面ls -l a.out 的结果输出我们知道,文件a.out的实际用户为stevens,a.out的状态为
**实际用户:读+写+执行; 组用户:读+写+执行; 其他用户:读+写
**执行a.out a.out的时候,a.out在shell下执行,执行的这个进程的有效用户id就等于这个文件的实际用户id,所以
**access和只读open()都能够成功
再看下面的程序运行:
$ ls -l /etc/uucp/Systems
-rw-r----- 1 uucp 1441 Jul 18 15:05 /etc/uucp/Systems
$ a.out /etc/uucp/Systems
access error for /etc/uucp/Systems: Permission denied
open error for /etc/uucp/Systems: Permission denied
** 可以看到 /etc/uucp/Systems 这个文件的实际用户为uucp,且文件权限为:
** 实际用户:读+写; 组用户:读; 其他用户:无权限
** 当我们以stevens这个用户去access() 和 read() 这个文件时,将会失败
再看下面的继续:
$ su #称为超级用户,拥有无上的权限
# chown uucp a.out **将a.out文件用户改为uucp
# chmod u+s a.out **打开设置-用户-ID位
$ ls -l a.out
-rwsrwxr-x 1 uucp 105216 Jan 18 08:48 a.out
**可以看到这时a.out的实际用户和文件标志位已经改变
#exit **回到正常用户
$ a.out /etc/uucp/Systems
access error for /etc/uucp/Systems: Permission denied
open for reading OK
**结果是:a.out access() /etc/uucp/Systems 失败,但是打开却成功了。
**原因:a.out运行起来的进程实际用户还是steven,但是由于a.out打开了
**设置-用户-ID位,所以进程的有效用户id已经变为了文件a.out文件的实际用户id,即uucp.
**而access检查的是进程的实际用户id,a.out运行起来后的实际用户steven
**read() 能否读取文件,检查的是进程的有效用户id,这里即uucp,这是可以 读+执行的
**总结:
**1.执行一个文件a.out的时候产生一个进程p, 通常p的有效用户id等于就是实际用户id,有效组id
** 就是实际组id。而这个实际用户id和实际组id取自我们登录系统时口令文件中的登录项
**2.当一个可执行文件a.out打开了“设置-用户-ID”位或者 “设置-组-ID位”时,执行a.out文件的进程
** 的有效用户id或有效组id将和文件a.out一致
**3.当一个进程创建一个文件时,默认情况下文件的用户id设置为进程的用户id,而组id,根据系统不
** 同,新文件的组id可以是进程的有效组id,也可以是它所在目录的组id
*/
阅读(991) | 评论(0) | 转发(0) |