gpt4 book ai didi

linux - 关于硬链接(hard link)

转载 作者:IT王子 更新时间:2023-10-29 00:08:20 24 4
gpt4 key购买 nike

有人能解释一下为什么内核不允许我们建立到目录的硬链接(hard link)吗?是因为它破坏了文件系统的有向无环图结构规则,还是因为其他原因。如果它允许,还会出现什么其他并发症?

最佳答案

在第 7 版(或第 7 版)UNIX 时代,还没有系统调用 mkdir(2)rmdir(2)mkdir(1) 程序是 SUID root,并使用 mknod(2) 系统调用创建目录和 link(2)系统调用以在新目录中生成 ... 的条目。 link(2) 系统调用只允许 root 执行此操作。因此,早在那时(大约 1978 年), super 用户就可以创建指向目录的链接,但只有 super 用户才被允许这样做,以确保不存在循环或其他丢失链接的问题。例如,如果在部分创建目录时系统崩溃,则有诊断程序可以解决问题。


您可以在 Bell Labs 找到 Unix 第 7 版手册.第 2 和第 3 部分没有 mkdir(2)rmdir(2)。您使用了 mknod(2) 系统调用来创建目录:

NAME

mknod – make a directory or a special file

SYNOPSIS

mknod(name, mode, addr)
char *name;

DESCRIPTION

Mknod creates a new file whose name is the null-terminated string pointed to by name. The mode of the new file (including directory and special file bits) is initialized from mode. (The protection part of the mode is modified by the process’s mode mask; see umask(2)). The first block pointer of the i-node is initialized from addr. For ordinary files and directories addr is normally zero. In the case of a special file, addr specifies which special file.

Mknod may be invoked only by the super-user.

SEE ALSO

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

DIAGNOSTICS

Zero is returned if the file has been made; – 1 if the file already exists or if the user is not the superuser.

link(2) 的条目指出:

DIAGNOSTICS

Zero is returned when a link is made; – 1 is returned when name1 cannot be found; when name2 already exists; when the directory of name2 cannot be written; when an attempt is made to link to a directory by a user other than the super-user; when an attempt is made to link to a file on another file system; when a file has too many links.

unlink(2) 的条目指出:

DIAGNOSTICS

Zero is normally returned; – 1 indicates that the file does not exist, that its directory cannot be written, or that the file contains pure procedure text that is currently in use. Write permission is not required on the file itself. It is also illegal to unlink a directory (except for the super-user).

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

It is forbidden to link to a directory or to link across file systems.

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

Standard entries, '.', for the directory itself, and '..' for its parent, are made automatically.

如果没有这些链接也可以创建目录,这就不值得评论了。


现在,mkdir(2)rmdir(2) 系统调用是标准的,允许任何用户创建和删除目录,保留正确的语义。不再需要允许用户创建到目录的硬链接(hard link)。这是双重事实,因为引入了符号链接(symbolic link) - 它们不在第 7 版 UNIX 中,而是很早就出现在 UNIX 的 BSD 版本中。


对于普通目录,.. 条目明确地链接回 the(单个、单独的)父目录。如果您在不同目录中的同一目录有两个硬链接(hard link)(两个名称),那么 .. 入口点在哪里?据推测,到原始父目录 - 并且可能无法从链接目录到达“其他”父目录。这种不对称会引起麻烦。通常,如果您这样做:

chdir("./subdir");
chdir("..");

(其中 ./subdir 不是符号链接(symbolic link)),然后您将回到开始的目录。如果 ./subdir 是指向其他地方目录的硬链接(hard link),那么在第二个 chdir() 之后,您将位于与开始位置不同的目录中。您必须在所示的 chdir() 操作之前和之后通过一对 stat() 调用来证明这一点。

关于linux - 关于硬链接(hard link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5829001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com