预计阅读本页时间:-
1.6.3 用于目录管理的系统调用
本节我们讨论与目录或整个文件系统有关的某些系统调用,而不是1.6.2节中与一个特定文件有关的系统调用。mkdir和rmdir分别用于创建和删除空目录。下一个调用是link。它的作用是允许同一个文件以两个或多个名称出现,多数情形下是在不同的目录中这样做。它的典型应用是,在同一个开发团队中允许若干个成员共享一个共同的文件,他们之中的每个人都在自己的目录中有该文件,但可能采用的是不同的名称。共享一个文件,与每个团队成员都有一个私用副本并不是同一件事,因为共享文件意味着,任何成员所做的修改都立即为其他成员所见——只有一个文件存在。而在复制了一个文件的多个副本之后,对其中一个副本所进行的修改并不会影响到其他的副本。
为了考察link是如何工作的,考虑图1-21a中的情形。有两个用户,ast和jim,每个用户都有一些文件的目录。若ast现在执行一个含有系统调用的程序
link("/usr/jim/memo","usr/ast/note");
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
在jim目录中的文件memo,以文件名note进入ast的目录。之后,/usr/jim/memo和/usr/ast/note都引用相同的文件。顺便提及,用户是将目录保存在/usr、/user、/home还是其他地方,则完全取决于本地系统管理员的决定。
理解link是如何工作的也许有助于读者看清其作用。在UNIX中,每个文件都有惟一的编号,即i-编号,用以标识文件。该i-编号是对i-节点表格的一个引用,它们一一对应,说明该文件的拥有者,磁盘块的位置等。一个目录就是包含了(i-编号,ASCII名称)对集合的一个文件。在UNIX的第一个版本中,每个目录项有16个字节——2个字节用于i-编号,14个字节用于名称。现在为了支持长文件名,采用了更复杂的结构,但是,在概念上,目录仍然是(i-编号,ASCII名称)对的一个集合。在图1-21中,mail为i-编号16,等等。link所做的只是利用某个已有文件的i-编号,创建一个新目录项(也许用一个新名称)。在图1-21b中两个目录项有相同的i-编号(70),从而指向同一个文件。如果其中某一个文件后来被移走了,使用unlink系统调用,可以保留另一个。如果两个都被移走了,UNIX 00看到尚存在的文件没有目录项(i-节点中的一个域记录着指向该文件的目录项),就会把该文件从磁盘中移去。

正如我们已经叙述过的,mount系统调用允许将两个文件系统合并成为一个。通常的情形是,在硬盘上的根文件系统含有常用命令的二进制(可执行)版和其他常用的文件。用户可在CD-ROM驱动器中插入包含有需要读入文件的CD-ROM盘。
通过执行mount系统调用,可以将一个CD-ROM文件系统添加到根文件系统中,如图1-22所示。完成安装操作的典型C语句为
mount("/dev/fd0","/mnt",0);

这里,第一个参数是驱动器0的块特殊文件名称,第二个参数是要被安装在树中的位置,第三个参数说明将要安装的文件系统是可读写的还是只读的。
在mount调用之后,驱动器0上的文件可以使用从根目录开始的路径或工作目录路径,而不用考虑文件在哪个驱动器上。事实上,第二个、第三个以及第四个驱动器也可安装在树上的任何地方。mount调用使得把可移动介质都集中到一个文件层次中成为可能,而不用考虑文件在哪个驱动器上。尽管这是个CD-ROM的例子,但是也可以用同样的方法安装硬盘或者硬盘的一部分(常称为分区或次级设备),外部硬盘和USB盘也一样。当不再需要一个文件系统时,可以用umount系统调用卸载之。