供程序员使用的链接

链接是文件名和索引节点(硬链接)之间或文件名(符号链接)之间的连接。

链接允许从多个文件名对索引节点进行访问。 目录条目是一对文件名和索引节点。 文件名便于用户识别,而索引节点包含文件数据的实际磁盘地址。 索引节点的 i_nlink 字段中提供索引节点所有链接的引用计数。 创建链接和破坏链接的子例程使用的是文件名,而不是文件描述符。 因此,创建链接时不必打开文件。

进程可以根据任何链接的文件名,访问和更改索引节点的内容。 AIX支持硬链接和符号链接。

硬链接

子例程 描述
链接 创建硬链接的子例程。 硬链接的存在确保文件的存在,因为硬链接会增加索引节点的 i_nlink 字段中的链接计数。
取消链接 放弃链接的子例程。 当放弃了索引节点的所有硬链接时,文件不再具有可访问性。

硬链接必须链接同一文件系统内的文件名和索引节点,因为索引节点号与单个文件系统相关。 硬链接总是指向特定的文件,因为由硬链接创建的目录条目将新文件名和索引节点配对。 创建原文件的用户标识拥有文件并保留对文件访问方式的权限。 否则,操作系统同等地对待所有的硬链接。

示例: 如果 /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 字段。

子例程 描述
读链接 读取符号链接内容的子例程。 许多子例程 (包括 openstat 子例程) 遵循符号路径。
lstat 为报告包含符号链接的文件的状态而创建的子例程,它不遵守链接。 请参阅 symlink 子例程获取穿过符号链接的子例程列表。

符号链接也称为软链接,因为它们通过路径名链接到文件。 如果目标文件已重新命名或已除去,那么符号链接无法进行解析。

示例:/u/joe/foo 的符号链接是包含文字数据 /u/joe/foo 的文件。 当 foo 文件的所有者除去该文件时,对符号链接所作的子例程调用将无法完成。 如果文件所有者又在同一目录中创建一个名为 foo 的新文件,那么符号链接指向此新文件。 因此,因为这种链接链接到可换的索引节点,所以它被认为是软链接。

ls-l命令列表中,一个l在第一位置指示链接文件。 在该列表的最后一列中,文件之间的链接表示为Path2 -> Path1(或 Newname -> Oldname).

子例程 描述
除去 通过调用 unlinkrmdir 子例程,也用于除去文件名的子例程。

目录链接

子例程 描述

建议使用符号链接创建对目录的其他链接。 符号链接不会干扰 . 和 .. 目录条目,并将维护空的、格式良好的目录的状态。 和 ... 目录条目,并将维护空的、格式良好的目录的状态。 以下示例说明空的、格式良好的目录 /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 )。