Chinaunix首页 | 论坛 | 博客
  • 博客访问: 135703
  • 博文数量: 39
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 237
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-23 10:59
文章分类

全部博文(39)

文章存档

2016年(2)

2015年(25)

2014年(10)

2013年(2)

我的朋友

分类: C/C++

2015-07-08 23:33:45

在unix高级环境编程中有个4-2 程序,这里写一下自己的理解:
程序如下:

点击(此处)折叠或打开

  1. #include <sys/types.h>
  2. #include <fcntl.h>
  3. #include "ourhdr.h"


  4. int main(int argc , char* argv[])
  5. {
  6. if (argc != 2)
  7. err_quit("usage: a.out");
  8. if(access(argv[1] , R_OK) < 0)
  9. err_ret("access error for %s",argv[1]);
  10. else
  11. printf("read access OK\n");
  12. if(open(argv[1] , O_RDONLY) < 0)
  13. err_ret("open error for %s" , argv[1]);
  14. else
  15. printf("open for reading OK\n");
  16. exit(0);
  17. }



 下面该程序的一些运行结果:
 $ 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
*/
阅读(952) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~