关于硬链接

pra*_*tri 10 unix linux filesystems

有人可以解释一下为什么内核不允许我们建立到目录的硬链接.是否因为它违反了文件系统的有向无环图结构的规则,或者是因为其他一些原因.如果它允许的话还有什么其他复杂情况?

Jon*_*ler 17

早在第7版(或版本7)UNIX的时代,就没有系统调用mkdir(2)rmdir(2).该mkdir(1)程序是SUID root,并使用mknod(2)系统调用来创建目录和link(2)系统调用,以便为新目录...新目录创建条目.该link(2)系统调用只允许root来做到这一点.因此,当时(大约1978年),超级用户可以创建指向目录的链接,但只允许超级用户这样做以确保周期或其他缺失链接没有问题.例如,如果在部分创建目录时系统崩溃,则存在用于拾取碎片的诊断程序.


你可以在贝尔实验室找到Unix第7版手册.第2节和第3节没有mkdir(2)rmdir(2).您使用mknod(2)系统调用来创建目录:

名称

mknod - 制作目录或特殊文件

概要

mknod(name, mode, addr)
char *name;
Run Code Online (Sandbox Code Playgroud)

描述

Mknod创建一个新文件,其名称是由name指向的以null结尾的字符串.新文件的模式(包括目录和特殊文件位)从模式初始化.(模式的保护部分由进程的模式掩码修改;请参阅umask(2)).i节点的第一个块指针是从addr初始化的.对于普通文件和目录,addr通常为零.对于特殊文件,addr指定哪个特殊文件.

Mknod只能由超级用户调用.

也可以看看

mkdir(1),mknod(1),filsys(5)

诊断

如果文件已经生成,则返回零; - 如果文件已存在或用户不是超级用户,则为1.

link(2)州的条目:

诊断

建立链接时返回零; - 无法找到name1时返回1; 当name2已存在时; 当name2的目录无法写入时; 当尝试由超级用户以外的用户链接到目录时; 当试图链接到另一个文件系统上的文件时; 当文件有太多链接时.

unlink(2)州的条目:

诊断

零通常返回; - 1表示该文件不存在,无法写入其目录,或者该文件包含当前正在使用的纯过程文本.文件本身不需要写入权限.取消链接目录(超级用户除外)也是违法的.

ln(1)命令的手册页指出:

禁止链接到目录或跨文件系统链接.

mkdir(1)命令说明的手册页:

目录本身的标准条目"."和其父项的".."是自动生成的.

如果不能创建没有这些链接的目录,这就不值得评论.


如今,mkdir(2)rmdir(2)系统调用标准,允许任何用户创建和删除目录,保持正确的语义.不再需要允许用户创建指向目录的硬链接.自引入符号链接以来,这是双重的 - 它们不是在第7版UNIX中,而是从很早就开始使用的是BSD版本的UNIX.


与正常的目录中,..条目明确链接回(单,孤)的父目录.如果在不同目录中有相同目录的两个硬链接(两个名称),那么..入口点在哪里?据推测,到原始父目录 - 并且可能无法从链接目录到达"其他"父目录.这是一种可能导致麻烦的不对称现象.通常情况下,如果你这样做:

chdir("./subdir");
chdir("..");
Run Code Online (Sandbox Code Playgroud)

(这里./subdir不是符号链接),然后你将回到你开始的目录中.如果./subdir是到其他地方的目录的硬链接,那么您将位于与第二个目录之后的目录不同的目录中chdir().您必须在显示stat()chdir()操作之前和之后显示一对调用.


Aur*_*nda 6

这完全是因为允许指向目录的硬链接允许目录图中的潜在循环和循环,而不会增加太多值.