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. python编辑器对比和推荐

    python编辑器对比和推荐   我先给一个初步的表格吧,大家如果有什么意见,或有补充,欢迎提出.有些我没有用过,先不写了.以下是我使用过的python IDE: 除了PythonWin, Visua ...

  2. 顶尖数据挖掘辅助教学套件(TipDM-T6)产品白皮书

          顶尖数据挖掘辅助教学套件 (TipDM-T6)           产  品  说  明  书 广州泰迪智能科技有限公司 版权所有 地址: 广州市经济技术开发区科学城232号 网址: ht ...

  3. PHP - Mysql数据库备份类

    使用方法: require_once("backdata.class.php"); $link =@mysql_connect("localhost",&quo ...

  4. 网易云课堂_艾叔:零基础一站式C语言|C程序设计精讲_章节12:指针

    课时63指针操作数组 二维数组 #include <stdio.h> #include <stdlib.h> int main() { int age[2][4] = { 1, ...

  5. wxpython 拖放

    拖放对用户是非常直观.它在许多桌面应用程序,用户可以复制或只需用鼠标拖动和删除另一个窗口中移动对象从一个窗口到另一个中. 拖放操作包括以下步骤 - 声明拖放目标 创建数据对象 创建 wx.DropSo ...

  6. C#中关键字ref与out的区别【转】

    在C#中,ref与out是很特殊的两个关键字.使用它们,可以使参数按照引用来传递.总的来说,通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢 ...

  7. (转)c#对象内存模型

    对象内存模型 C#的对象内存模型写这篇博客的主要目的是为了加深自己的理解,如有不对的地方,请各位见谅. C#的对象内存模型: 一.栈内存和堆内存1.栈内存 由编译器自动分配和释放,主要用来保存一些局部 ...

  8. 子级Repeater获取 父级Repeater

    第一种方法,子级Repeater中绑定父级的某个字段: <%# DataBinder.Eval((Container.NamingContainer.NamingContainer as Rep ...

  9. Iframe和父窗口互调方法的集合

    1.子iframe里调用父级的方法:window.parent.document.   2.父级里调用子集iframe:window.frames["iframe_text"].d ...

  10. Log4net 参数详解

    <log4net> <!-- 错误日志类--> <logger name="logerror"> <level value="A ...