1.与进程关联的用户ID和组ID

与一个进程关联的ID有一下几个:
实际用户ID和实际组ID标识我们究竟是谁。通常在一个会话间值是不会改变的,但是超级用户进程有方法改变
他们,在以后的进程控制中会进行说明。
有效用户ID,有效组ID以及附加组ID决定了我们的文件访问权限。
保存的设置用户ID(setuid)和保存的设置组ID(setgid)在执行一个程序时包含了有效用户ID和有效组ID的
副本。
 
通常,有效用户ID等于实际用户ID,有效组ID等于实际组ID。
每个文件都有一个所有者和组所有者,所有者由stat结构中的st_uid成员表示,组所有者由st_gid成员表示。
当执行一个程序文件时,进程有效用户ID通常就是实际用户ID,有效组ID通常是实际组ID,但是可以设置文件
的设置用户ID(set-user-ID)位和设置组ID(set-group-ID )位,如果设置了设置用户ID位,则进程在执行该
程序时就具有该程序所有者的权限(进程的有效用户ID设置为程序所有者用户ID),如果设置了设置组ID位,
则进程在执行该程序时就具有该程序的组所有组 的权限 (进程的有效组ID设置为程序组所有者ID) 。
设置用户ID位和设置组ID位都包含在st_mode值中。可以使用宏S_ISUID和S_ISGUID测试。

2.文件的访问权限

每个文件都有9个访问权限位,可将它们分成3类,如下图:


它们都包含在<sys/stat.h>文件中。

下面说明一些文件访问权限的一些规则:
1.如果我们要访问一个文件,必须要对该文件绝对路径中包含的所有目录都具有执行权限。
实践如下:
yan@yan-vm:/home$ ll

total 16

drwxr-xr-x  4 root       root        4096 Jun  4 13:03 ./

drwxr-xr-x 23 root       root        4096 Apr 12 20:43 ../

drwx------  3 normaluser normalgroup 4096 Jun 12 11:23 normaluser/

drwx------ 25 yan        yan         4096 Jun 12 11:27 yan/

yan@yan-vm:/home$ cat /home/yan/test

123

yan@yan-vm:/home$ chmod u-x yan/

yan@yan-vm:/home$ cat /home/yan/test

cat: /home/yan/test: Permission denied

yan@yan-vm:/home$

上面的yan目录被去掉x权限后,yan目录的用户yan也无法访问目录里面的文件。

2.为了在一个目录中创建新文件,必须要对目录具有写权限和执行权限。
实践如下:

yan@yan-vm:/home$ ll

total 16

drwxr-xr-x  4 root       root        4096 Jun  4 13:03 ./

drwxr-xr-x 23 root       root        4096 Apr 12 20:43 ../

drwx------  3 normaluser normalgroup 4096 Jun 12 11:23 normaluser/

d--------- 25 yan        yan         4096 Jun 12 11:27 yan/     (目录没有任何权限)

yan@yan-vm:/home$ chmod u+w yan/

yan@yan-vm:/home$ ll

total 16

drwxr-xr-x  4 root       root        4096 Jun  4 13:03 ./

drwxr-xr-x 23 root       root        4096 Apr 12 20:43 ../

drwx------  3 normaluser normalgroup 4096 Jun 12 11:23 normaluser/

d-w------- 25 yan        yan         4096 Jun 12 11:27 yan/   (增加w权限)

yan@yan-vm:/home$ touch yan/a.txt

touch: cannot touch `yan/a.txt': Permission denied     (生成文件失败)

yan@yan-vm:/home$ chmod u+x yan/

yan@yan-vm:/home$ ll

total 16

drwxr-xr-x  4 root       root        4096 Jun  4 13:03 ./

drwxr-xr-x 23 root       root        4096 Apr 12 20:43 ../

drwx------  3 normaluser normalgroup 4096 Jun 12 11:23 normaluser/

d-wx------ 25 yan        yan         4096 Jun 12 11:27 yan/   (增加执行权限权限)

yan@yan-vm:/home$ touch yan/a.txt     (成功生成文件)

yan@yan-vm:/home$


3.为了在一个目录中删除现有的文件,必须对包含该文件的目录具有写权限和执行权限。

4.如果用6个exec函数中的任何一个执行某个文件,都必须对该文件具有执行权限,该文件还必须是一个普通文件。

进程每次打开、创建和删除一个文件时,内核要进行文件访问权限测试:
1.若进程的有效用户ID是0(超级用户),则允许访问。
2.若进程的有效用户ID等于文件的所有者ID(也就是该进程拥有此文件),那么:若所有者的适当访问权限位(读,
写,执行)

设置,
则允许访问,否则拒绝访问。
3.若进程的有效组ID或进程的附加组ID之一等于文件的组ID,那么若组适当的访问权限位被设置,则允许访问,否则
拒绝访问。
4.若其他用户适当的访问权限位被设置,则允许访问,否则拒绝访问。

3.新文件、目录的所有权

新文件、目录的用户ID设置为进程的有效用户ID,关于组ID,POSIX.1允许实现选择下列之一作为新文件的组ID:
1.新文件的组ID可以是进程的有效组ID。(在ubuntu中使用这种实现)
2.新文件的组ID可以是它所在的目录的组ID。

《UNIX环境高级编程》笔记--文件访问权限和新文件、目录所有权的更多相关文章

  1. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...

  2. UNIX环境高级编程笔记 目录

    每一章的重点会使用加粗字体 第一章:UNIX基础知识:UNIX体系结构:文件和目录:输入和输出:程序和进程:出错处理:信号:时间值:系统调用和库函数 第三章:文件I/O:文件描述符:文件操作函数:文件 ...

  3. UNIX环境高级编程笔记之高级I/O

    本章说明了很多高级I/O功能: 非阻塞I/O——发一个I/O操作,不使其阻塞,记录锁,STREAMS机制 I/O多路转接——select和poll函数 readv和writev函数,以及存储映射I/O ...

  4. UNIX环境高级编程笔记之标准I/O库

    一.总结 文件I/O一章讲了不带缓冲的I/O,本章讲的是带缓冲的I/O.不带缓冲针对的是内核的系统调用,而带缓冲针对的是用户空间的标准库函数,是基于带缓冲的I/O实现的.不带缓冲的I/O通过文件描述符 ...

  5. UNIX环境高级编程笔记之线程

    本章涉及到线程的一些基本知识点,讨论了现有的创建线程和销毁线程的POSIX.1原语,此外,重点介绍了线程同步问题,讨论了三种基本的同步机制:互斥量.读写锁.条件变量.

  6. UNIX环境高级编程笔记之进程控制

    本章重点介绍了进程控制的几个函数:fork.exec族._exit.wait和waitpid等,主要需要掌握的是父进程和子进程之间的运行机制,怎么处理进程的正常和异常终止.以及怎么让进程执行不同的程序 ...

  7. UNIX环境高级编程笔记之进程环境

    本章讲的都是一些非常基础的知识,目的是为了下一章讲进程控制做铺垫,所以,本章就不做过多的总结了,直接看图吧.

  8. Unix环境高级编程——守护进程记录总结(从基础到实现)

    一.概念及其特征 守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行.守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程 ...

  9. [置顶] 文件和目录(二)--unix环境高级编程读书笔记

    在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...

随机推荐

  1. CLR读书笔记——委托

    协变性和逆变性 协变性是指方法能返回从委托返回类型派生的一个类型. 逆变性是指获取的参数可以是委托参数类型的基类. 举个例子吧,看以下定义的委托,以及方法. delegate Object MyCal ...

  2. haproxy image跳转 haproxy匹配 匹配到了就停止,不会继续往下匹配

    <pre name="code" class="html">/***第一种 nginx 配置: location / { root /var/www ...

  3. PF_RING packet overwrites

    最近在用 PF_RING 抓包过程中,发现个灵异的现象,高流量丢包时, 经常会出现正在处理的包的内容被覆盖.开始,怀疑是不是自己程序有地方越界写了,后来发现,如果自己拷贝一份,然后处理拷贝的那份,永远 ...

  4. 使用httpwatch抓包

    httpwatch抓包工具是MS的ie自带的一个插件. 但是千里之行始于足下,所以先来利用httpwatch抓一些包来分析分析. 打开IE,快捷键shift+F2打开httpwatch. 如下图: 本 ...

  5. 2.x ESL第二章习题2.5

    题目 描述 $y_i=x_i^T\beta+\epsilon_i$$\epsilon_i\sim N(0,\sigma^2)$ 已有训练集$\tau$,其中$X:n\times p,y:n\times ...

  6. UML_部署图

    一.部署图简介(Deployment Diagram Introduction) 二.部署图元素(Deployment Diagram Elements) 1.结点(Node) 2.结点实例(Node ...

  7. 【C/C++】Linux下使用system()函数一定要谨慎

    [C/C++]Linux下使用system()函数一定要谨慎 http://my.oschina.net/renhc/blog/53580 曾经的曾经,被system()函数折磨过,之所以这样,是因为 ...

  8. 3、使用Lucene实现千度搜索

    1.新建Web项目 新建一个Web项目,我命名为SearchEngine,然后导入Java包: 除了上篇博客中的Jar包外,我还引入了 IKAnalyzer2012_FF.jar 包和struts2的 ...

  9. #include <boost/thread.hpp>

    在这个库最重要的一个类就是boost::thread,它是在boost/thread.hpp里定义的,用来创建一个新线程.它已经被纳入C++标准库中. 小结:新一代C++标准将线程库引入后,将简化多线 ...

  10. Codeforces Round #245 (Div. 1)——Working out

    题目链接 题意: 一个n*m的矩阵,每一个方格有一个非负数,如今选择两条线路:一个左上到右下,一个左下到右上,且仅仅能有一个公共点. 求两个线路上数的最大值(公共点不算) 分析: 仅仅有两种情况,dp ...