供程序员使用的链接
链接是文件名和索引节点(硬链接)之间或文件名(符号链接)之间的连接。
链接允许从多个文件名对索引节点进行访问。 目录条目是一对文件名和索引节点。 文件名便于用户识别,而索引节点包含文件数据的实际磁盘地址。 索引节点的 i_nlink 字段中提供索引节点所有链接的引用计数。 创建链接和破坏链接的子例程使用的是文件名,而不是文件描述符。 因此,创建链接时不必打开文件。
进程可以根据任何链接的文件名,访问和更改索引节点的内容。 AIX支持硬链接和符号链接。
硬链接
硬链接必须链接同一文件系统内的文件名和索引节点,因为索引节点号与单个文件系统相关。 硬链接总是指向特定的文件,因为由硬链接创建的目录条目将新文件名和索引节点配对。 创建原文件的用户标识拥有文件并保留对文件访问方式的权限。 否则,操作系统同等地对待所有的硬链接。
示例: 如果 /u/tom/bob 文件链接到 /u/jack/foo 文件,那么 foo 文件的 i_nlink 字段中的链接计数为2. 两个硬链接都是平等的。 如果除去 /u/jack/foo,那么使用名称 /u/tom/bob 的文件继续存在,且可以被具有对 tom 目录访问权的用户访问。 但是,该文件的所有者是jack即使除去了 /u/jack/foo 。 由文件占用的空间归于 jack 的限额帐户。 要更改文件所有权,请使用 chown 子例程。
符号链接
符号链接通过使用 symlink 命令实现为包含路径名的文件。 当进程遇到符号链接时,包含在符号链接中的路径被预先考虑为进程正在搜索的路径。 如果符号链接中的路径名是绝对路径名,那么进程从根目录搜索命名的文件。 如果符号链接中的路径名不是以 /(斜杠),那么进程将其余的路径解释为与符号链接的位置相关。 unlink 子例程还除去符号链接。
符号链接可以穿过文件系统,因为它们被操作系统视为常规文件,而非文件系统结构的部分。 存在符号链接并不保证目标文件存在,因为符号链接不影响索引节点的 i_nlink 字段。
| 子例程 | 描述 |
|---|---|
| 读链接 | 读取符号链接内容的子例程。 许多子例程 (包括 open 和 stat 子例程) 遵循符号路径。 |
| lstat | 为报告包含符号链接的文件的状态而创建的子例程,它不遵守链接。 请参阅 symlink 子例程获取穿过符号链接的子例程列表。 |
符号链接也称为软链接,因为它们通过路径名链接到文件。 如果目标文件已重新命名或已除去,那么符号链接无法进行解析。
示例:/u/joe/foo 的符号链接是包含文字数据 /u/joe/foo 的文件。 当 foo 文件的所有者除去该文件时,对符号链接所作的子例程调用将无法完成。 如果文件所有者又在同一目录中创建一个名为 foo 的新文件,那么符号链接指向此新文件。 因此,因为这种链接链接到可换的索引节点,所以它被认为是软链接。
在ls-l命令列表中,一个l在第一位置指示链接文件。 在该列表的最后一列中,文件之间的链接表示为Path2 -> Path1(或 Newname -> Oldname).
| 子例程 | 描述 |
|---|---|
| 取消链接 | 除去目录条目的子例程。 子例程中的 Path 参数指示要断开连接的文件。 当 unlink 调用完成时,索引节点的链接计数减去 1。 |
| 除去 | 通过调用 unlink 或 rmdir 子例程,也用于除去文件名的子例程。 |
目录链接
| 子例程 | 描述 |
|---|---|
| mkdir | 创建新目录的目录条目的子例程,它创建表示目录的索引节点的硬链接。 |
建议使用符号链接创建对目录的其他链接。 符号链接不会干扰 . 和 .. 目录条目,并将维护空的、格式良好的目录的状态。 和 ... 目录条目,并将维护空的、格式良好的目录的状态。 以下示例说明空的、格式良好的目录 /u/joe/foo 以及 i_nlink 值。
/u
| 值 | 空值 | 空值 | 目录 | |||
|---|---|---|---|---|---|---|
| 68 | j | o | e | 0 | ||
/u/joe
mkdir ("foo", 0666)
| 值 | 空值 | 空值 | 目录 | |||
|---|---|---|---|---|---|---|
| 68 | n | 0 | 0 | 0 | ||
| n | n | 0 | 0 | |||
| 235 | f | o | o | 0 | ||
/u/joe/foo
| 值 | 空值 | 空值 | 目录 | |||
|---|---|---|---|---|---|---|
| 235 | n | 0 | 0 | 0 | ||
| 68 | n | n | 0 | 0 | ||
i_nlink Values
i = 68
n_link 3
如果 i = 68,那么 n_link 值为 3 (/u; /u/joe; /u/joe/foo )。
i = 235
n_link 2
如果 i = 235,那么 n_link 值为 2 (/u/joe; /u/joe/foo )。