符号链接是什么文件模式?

符号链接是什么文件模式?

什么文件模式表明一个文件是符号链接(symlink)?


我的用例是检测 git 存储库(及其历史记录)内的符号链接。我的印象是符号链接之所以是符号链接是因为它的文件模式,而文件模式是工具chmod设置的。

答案1

文件模式涵盖两个不同的概念:文件类型和文件权限。文件的模式由调用st_mode结果中的值表示stat(2),并将ls -l它们一起呈现;看了解 UNIX 权限和文件类型了解详情。

文件一旦创建,其类型就无法更改。此外,在 Linux 系统上,您无法指定符号链接的权限;重要的是目标的许可(实际上是完整模式,因为它也决定了符号链接的行为)。看文件权限如何应用于符号链接?了解详情。在 Mac OS X 上,符号链接可以拥有自己的权限。

最后,git使用一个简化的模型,具有有限数量的可识别模式:

  • 040000对于一个目录
  • 100644对于普通文件
  • 100755对于可执行文件
  • 120000对于符号链接

您可以使用以下命令查看这些值git cat-file -p 'master^{tree}':看专业版 Git了解详情。

答案2

什么文件模式表明一个文件是符号链接(symlink)?

检查文件是否为符号链接的 POSIX API 使用宏S_ISLNK

在glibc中,S_ISLNK定义如下:

#define __S_IFMT    0170000 /* These bits determine file type.  */
#define __S_IFLNK   0120000 /* Symbolic link.  */
#define __S_ISTYPE(mode, mask)  (((mode) & __S_IFMT) == (mask))
#define S_ISLNK(mode)    __S_ISTYPE((mode), __S_IFLNK)

即文件是一个符号链接if ((mode & 0170000) == 0120000)(至少在 GNU/Linux 上)。

答案3

符号链接(尽管某些文件系统以不同方式处理符号链接)是inode指向与另一个文件(或目录)相同位置的表条目。

例如 if foois inode 1234then bar(指向 foo 的符号链接)是inode 1234

bar并不真正存在它只是一个指向“真实”文件的指针。

Symlinks通常没有它们指向的文件权限之外的权限。所以bar's权限是“相同的” as foo's。您不能bar仅对foo(真实文件)设置(符号链接)权限。

话虽如此,这是一个非常高层次的观点。不同的文件系统以不同的方式处理符号链接。不同的工具处理方式symlinks不同。有些文件系统会“标记”symlinks并专门处理它们,但有些则不会。

例如,chmodonLinux不会更改symlinks权限,但 onOSX您可以获取它。在这两种情况下,实际文件权限都会更改。

我想不出任何系统(并不意味着它不存在)其中 asymlink具有与真实文件分开的权限。

相关内容