第四章 文件和目录

本文详细介绍了C++中与文件和目录相关的函数,包括stat系列、access、umask、chmod、truncate、link、rename、symlink、readlink、futimens等,以及文件类型、用户ID和组ID、文件访问权限等概念。通过这些函数,可以实现文件的访问、权限管理、链接、重命名、时间戳修改等操作。
摘要由CSDN通过智能技术生成

相关函数

原型不再赘述,主要记录作用和理解
1. 函数 stat、fstat、fstatat、lstat
作用:
- stat :返回与此命名文件有关的信息结构;
- fstat :获得已在描述符 fd 上打开文件的有关信息;
- lstat :类似于 stat ,但当命名的文件是一个符号链接时,返回的是该符号链接的有关信息,而不是该符号链接引起的文件的信息;
- fstatat :返回 fd 指向的路径的文件统计信息,并且可以选择是否跟随一个符号链接;

2. 函数 access、faccessat
- 作用:按照实际用户ID 和实际组ID 进行访问权限测试

3. 函数 umask
- 作用:为进程设置文件模式创建屏蔽字;
在进程创建一个新文件或一个新的目录时,就一定会使用文件模式创建屏蔽字。

4. 函数 chmod、fchmod 和 fchmodat
- 作用:更改现有文件的访问权限
① chmod 在指定文件上操作;
② fchmod 对已打开的文件操作;
③ fchmodat 需要给定绝对路径;

5. 函数 truncate、ftruncate
- 作用:将一个现有文件截断为指定长度(长了就丢一些,短了的话就补0);
- 可以用来清空文件;

6. 函数 link、linkat、unlink、unlinkat、remove
- 作用:link 和 linkat 创建一个指向现有文件的链接;unlink 和 unlinkat 删除一个现有的目录项;remove 解除对一个文件或目录的链接(在功能上:对于文件,remove = unlink;对于目录,remove = rmdir);
- 当AT_REMOVEDIR标志被设置时,unlinkat 函数可以类似于 rmdir 一样删除目录;如果这个标志被清除,unlinkat = unlink;

7. 函数 rename 和 renameat
- 作用:文件或目录的重命名;
- 特殊情况:如果 oldname 或者 newname 引用符号链接,则处理的是符号链接本身,而不是它所引用的文件;如果 newname 已经存在,则调用进程需要对它有写权限,并且需要对包含 oldname 及包含 newname 的目录具有写和执行权限;

8. 函数 symlink 和 symlinkat
- 作用:创建一个符号链接;
- 创建符号链接时,并不要求被指向的对象已经存在;
- 符号链接和被指向的对象不需要位于同一文件系统;

9. 函数 readlink 和 readlinkat
- 作用:组合open、read 和 close 的所有操作;
在这里插入图片描述
10. 函数 futimens、utimensat 和 utimes
- 作用:更改一个文件访问和修改的时间;
- 使用 futimens 需要打开文件;utimensat 可以使用文件名更改文件时间;utimes 对路径名进行操作;
- i 节点的状态时间 st_ctim 不能被修改,当我们调用 utimes 时,此字段会被自动更新。

11. 函数 mkdir、mkdirat 和 rmdir
- 作用:mkdir 和 mkdirat :创建目录;rmdir:删除目录;

12. 函数 chdir、fchdir 和 getcwd
- chdir 和 fchdir :更改当前工作目录;
- getcwd:得到当前工作目录完整的绝对路径名。

文件类型

  1. 普通文件:包含某种形式的数据;
  2. 目录文件:包含其他文件的名字以及指向与这些文件有关信息的指针;(对一个目录文件来说,有读权限就可以访问,但只有内核可以直接写目录文件)
  3. 块特殊文件:提供对设备(如磁盘)带缓冲的访问;
  4. 字符特殊文件:提供对设备不带缓冲的访问;
    系统中所有的设备要么是字符特殊文件,要么是块特殊文件。
  5. FIFO:用于进程间通讯,有时也称为 命名管道;
  6. 套接字:用于进程间的网络通讯,也可以进行非网络进程间通讯(此时同FIFO);
  7. 符号链接:指向另一个文件。

用户ID 和 组ID

  1. 实际用户ID 和 实际组ID 标识我们实际上是谁,这两个字段在登陆时取自口令文件中的登录项;
  2. 有效用户ID、有效组ID 和 附属组ID 决定了我们的文件访问权限(通常有效ID和实际ID一致);
  3. 保存的设置用户ID 和 保存的设置组ID 在执行一个程序时包含了有效用户ID 和 有效组ID 的副本。

文件访问权限

进程每次打开、创建或删除一个文件时,内核就进行文件访问权限测试。
在这里插入图片描述

粘着位(保存正文位)

现在较新的UNIX系统大多数都配置了虚拟存储系统及快速文件系统,已经不再需要这种技术。

  1. 如果一个可执行程序文件的粘着位被设置了,那么当该程序第一次执行结束时,程序正文部分(机器指令)的一个副本仍被保存在交换区,这会使得下次执行该程序时能较快地将其装载入内存;
  2. 通常的UNIX文件系统中,文件的各数据块很可能是随即存放的,相对而言,交换区是作为一个连续文件来处理的。
  3. 现在的系统扩展了粘着位的使用范围,开始允许针对目录设置粘着位。如果对目录设置了粘着位,只有对该目录拥有写权限的用户并且满足条件(拥有此文件 / 拥有此目录 / 是超级用户)之一,才能删除或重命名该目录下的文件。

文件系统

  1. 把一个磁盘分成一个或多个分区,每个分区可以包含一个文件系统;
    i节点是固定长度的记录项,它包含有关文件的大部分信息。
    在这里插入图片描述
  2. 硬链接:相当于复制,要求链接和文件位于同一文件系统,只有超级用户才能创建指向目录的硬链接;
    软链接:相当于快捷方式;
  3. 当我们创建了一个目录:
    在这里插入图片描述

文件的时间

对每个文件维护3个时间字段:
- st_atim:文件数据的最后访问时间;
- st_myim:文件数据的最后修改时间;
- st_ctim:i 节点状态的最后修改时间;
注:系统并不维护对一个 i 节点的最后一次访问时间,所以 access 和 stat 函数并不更改这三个时间中的任一个。

设备特殊文件

  • 每个文件系统所在的存储设备都由其主、次设备号(dev_t)表示;
  • 主设备号标识设备驱动程序,次设备号标识特定的子设备;
  • 只有字符特殊文件和块特殊文件才有 st_rdev 值,此值包含实际设备的设备号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值