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. 【原创】QT5-卸载精灵v1.0-卸载windows软件-简易版

    由于项目需求,需要实现卸载windows上的普通软件的小功能,实现起来还是比较简单的. 先发个图: 思路: 1.根据注册表的信息去打开应用程序,卸载也一样: 2.读桌面的快捷方式,根据快捷方式的指向路 ...

  2. Entity Framewor中的 Migration

    http://www.entityframeworktutorial.net/code-first/code-based-migration-in-code-first.aspx = Code bas ...

  3. Linux文件解压缩详解

    tar命令 我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rar.可是Linux就不同了,它有.gz..tar.gz.tgz.bz2..Z..tar等众多的压缩文件名, ...

  4. 新建Android工程没有自动生成R.JAVA,应该先升级下ADT

    前几天非常郁闷,本来计划在Android上做个小东西,结果打开Eclipse新建工程,发现居然没有R.JAVA! 反复测试很多次,均未成功,最后试着升级了下ADT,结果搞定,在这里记下,下次遇到这样的 ...

  5. poj 1887 Testing the CATCHER_最长上升子序列

    题意:题目太长没看,直接看输入输出猜出是最长下降子序列 用了以前的代码直接a了,做法类似贪心,把最小的顺序数存在数组里面,每次二分更新数组得出最长上升子序列 #include<iostream& ...

  6. Exception in thread "main" java.io.IOException: Failed to set permissions of path

    在跑BuildForest的时候,编写了下面的程序: package test.breiman; import org.apache.mahout.classifier.df.mapreduce.Bu ...

  7. Android的读写文件权限

    设置文件生成的权限: public static boolean saveInfo( Context context, String userName, String userPass, int mo ...

  8. openfire研究之部署连接管理器(connection manager)

    http://blog.sina.com.cn/s/blog_7325f5150101bafh.html 一. Openfire Connection Manager 简介 Openfire Conn ...

  9. linux 内核源代码分析 - 获取数组的大小

    #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 測试程序: #include<stdio.h> #include<stdlib. ...

  10. SQL Server AlwaysOn 故障转移

    目的: a) AlwaysOn 可用性组功能是一个提供替代数据库镜像的企业级方案的高可用性和灾难恢复解决方案. b) 当数据库服务器SQL1出现故障宕机时,可以通过AlwaysOn可用性组,自动故障转 ...