unix环境高级编程 chap4 文件与目录

  • 概述:通过stat结构的每个成员以了解文件的所有属性,并说明修改这些属性的函数;介绍unix文件系统的结构以及符号链接、对目录进行操作的函数。
  1. stat.st_mode:包含文件类型、设置用户ID位和设置组ID位、文件访问权限这三类的信息;
    • 文件的类型以及文件类型测试宏:
      • 普通文件(exp:二进制可执行文件)
      • 目录文件:包含其他文件的名字及指向与这些文件有关信息的指针(inode节点号?)
      • 块设备特殊文件
      • 字符设备特殊文件
      • 套接字
      • 符号链接

    • 设置用户ID与设置组ID:使用常量S_ISUID、S_ISGID测试;由chmod、fchomod设置
      • 与进程相关连的ID:
        • 实际用户ID和实际组ID:用户标识登录的用户
        • 有效用户ID、有效组ID和附加组ID:用户文件访问权限的检查
        • 保存的设置用户ID和保存的设置组ID用于包含有效用户ID和有效用户组ID的副本
      • 每个文件都有一个所有者与组所有者,分别由stat.st_uid和stat.st_gid保存
      • 一般,有效用户ID等于实际用户ID,有效用户组ID等于实际用户组ID
      • 作用:当执行一个程序文件的时候,有效用户ID等于实际用户ID,有效用户组ID等于实际用户组ID;但是当stat.st_mode的设置用户ID位被置位时,则进程的有效用户ID设置为此程序文件所有者的用户ID;设置用户组ID位的作用与此类似;
  • 文件访问权限:9个访问权限

    • 访问权限的规则:相见apue chap4 4.5,其中:
      • 目录读权限:允许获得该目录中的所有文件名列表
      • 目录执行权限:允许可以通过该目录(也就是搜索该目录,寻找一个特定的文件名,因此,有时执行位也称为搜索位)
    • 内核中的访问权限测试规则(以下列出的顺序对应于相应的测试顺序):检查过程涉及到5中不同的ID,两个所有者ID是文件的性质,两个有效ID和附加组ID是进程的性质
      • 进程的有效用户ID为0(超级用户),无权限限制
      • 若进程的有效用户ID等于文件所有者ID,若所有者适当的访问权限被置位,则允许访问
      • 若进程的有效用户ID或进程的附加组ID等于文件组ID,那么:若组适当的访问权限被置位,则允许访问
      • 若其他用户适当的访问权限被置位,则允许访问
  • 新文件与目录的所有权:
    • 新文件用户ID(所有者)为进程有效用户ID
    • 新文件组ID(组所有者),根据实现可分:1. 可以是进程的有效则ID;2.可以是它所在目录的组ID(继承下来)
  • access函数:作用:以实际用户ID与实际组ID来测试文件的访问权限;其他函数一般以有效用户ID与有效组ID为基础来进行访问权限测试;

  • umask:为进程设置文件模式创建屏蔽字(这意味着对于屏蔽字中位为1的位,在文件mode中相应的位一定被屏蔽),并返回以前的值; 
    •   The  typical  default  value for the process umask is S_IWGRP | S_IWOTH
             (octal 022).  In the usual case where the mode argument to  open(2)  is
             specified as:


                 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH


             (octal 0666) when creating a new file, the permissions on the resulting
             file will be:


                 S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH


             (because 0666 & ~022 = 0644; i.e., rw-r--r--).
  • chmod、fchmod设置文件的访问访问权限,条件:进程的有效用户ID必须等于文件的所有者ID,或是进程必须有超级用户权限; 

    • S_ISVTX粘住位:粘住位历史;现今的扩展:Single UNIX Specification允许对目录设置粘住位;如果对一个目录设置了粘住位,则只有对该目录具有写权限的用户在满足下列条件之一的情况下,才能删除或更名目录下的文件:1.拥有此文件2.拥有此目录3.是超级用户
  • 文件长度:stat.st_size,只对普通文件、目录文件、符号链接有意义:已字节为单位的文件长度;可能在文件中存在空洞;空洞计入文件长度; 只是空洞不被实际存储;
  • 文件系统:
    •  i节点的相关概念:i节点包含大多数文件的相关信息,如文件类型、文件的访问权限位、文件长度以及指向该文件所占用数据块的指针等,stat结构的大部分信息都取自i节点;文件的属性(i节点)及数据的分开存放(数据块);
    • 目录项只存储两项信息:文件名,以及对应与此文件名的i节点编号


    • i节点的链接计数:其值为指向该i节点的目录项数;只有当计数为0时,才实际的删除次文件;这样以i节点为基础的链接(即多个目录向指向通过一个i节点)称为硬链接; 硬链接使用的主要函数有link、unlink、remove、rename; 由于各个文件系统各自的对它们的i节点进行编号,那么就有可能出现同一个i节点的编号出现在多个文件系统中,因此不能使目录项指向另一个文件系统的i节点,即硬链接不能跨文件系统;在统一个文件系统中移动文件或更名时,文件的实际数据并不需要移动,只要构造一个指向此文件i节点的新目录项,然后删除此文件i节点与旧目录项的链接即可; 
    • 符号链接:被链接的文件的完整路径被保存在符号链接文件的数据块中,并且符号链接文件的文件类型为S_IFLNK;主要使用的函数:symlink、readlink
      • 优点:1.可以跨越文件系统、可以链接到目录
      • 特别要注意一些函数是否会处理符号链接,即跟随符号链接到达它所链接的文件;


    • 文件时间:

      • 注意st_ctime与st_mtime的区别:前者表示文件所对应i节点的修改时间,后者表示文件数据的修改时间;
    • 设备特殊文件:
      • stat.st_dev与stat.st_rdev的区别:
        • 系统中的与每个文件关联的st_dev值是文件系统的设备号;该文件系统包含了这一文件名以及其对应的i节点
        • 只有字符特殊文件和块特殊文件才有st_rdev值;此值包含实际设备的设备号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值