链接

理解链接的最好方法是看一个例子。下面让我们创建一个(普通)文件:

$ pwd
/home/zhang/example
   $ ls
   $ touch a
   $ ls -il a
   32555 -rw-rw-r--    1 zhang     zhang            0 Dec 10 08:12 a

ls 命令中的 -i 选项用来打印信息节点号。信息节点号是输出的第一项。像您看到的那样,在我们创建文件 a 之前,目录里没有文件。输出的第三项也很有意思,这是文件链接(实际是信息节点链接)的数目。

touch a 命令可以被明显地分成两个步骤执行:

但是现在,如果我们键入:

$ ln a b
   $ ls -il a b
   32555 -rw-rw-r--    2 zhang     zhang            0 Dec 10 08:12 a
   32555 -rw-rw-r--    2 zhang     zhang            0 Dec 10 08:12 b
   $

我们建立了一个指向相同信息节点的链接。像您看到的那样,我们并没有建立叫做 b 的文件。我们只是在相同目录下增加了另外一个一个指向32555号信息节点的链接并把它取名为 b 。您可以通过 ls -l 的输出看到对信息节点的链接计数现在已经从1变成了2。

现在,如果我们键入:

$ rm a
   $ ls -il b
   32555 -rw-rw-r--    1 zhang     zhang            0 Dec 10 08:12 b
   $

我们看到即使删除了“原始文件”,信息节点仍然存在。但是现在,唯一指向它的链接是叫做 /home/zhang/example/b 的文件。

因此,一个 UNIX® 中的文件是没有名字的,取而代之的是,它有一个或几个存在于一个或几个目录下的链接

目录本身也由信息节点存储,它们的链接计数和它们拥有的子目录数相同。这是因为每个目录里至少有两个链接:目录本身(.)和它的父目录(..)。

网络连接是典型的没有被链接的文件(比如没有名字)的例子;不论您在哪个目录里寻找,您都永远不会在文件树里看到对应 Mandrakelinux web site 的文件。相似地,当您在 shell 里使用管道的时候,对应于管道的信息节点是存在的,但是它没有被链接。别的没有名字的信息节点是临时文件。您创建临时文件,打开它,然后删除它。文件从被打开的那一刻起就存在了,但是没有别的用户可以打开它(因为它没有名字来让别人打开它)。这样,如果应用程序崩溃,临时文件会被自动删除。