linux 可以解析多少层符号链接

linux 可以解析多少层符号链接

我正在阅读《Linux 编程接口》,这本书说:

SUSv3 要求实现至少允许_POSIX_SYMLOOP_MAX取消引用路径名的每个符号链接组件。_POSIX_SYMLOOP_MAX的指定值为8。然而,在内核 2.6.18 之前,Linux 在遵循符号链接链时施加了 5 次取消引用的限制。从内核 2.6.18 开始,Linux 实现了 SUSv3 指定的最少 8 次取消引用。 Linux 还对整个路径名施加总共 40 次取消引用。

我不太明白最后两句话8,这些和40限制有什么区别?我测试了自己,在我的机器中创建了一堆符号链接以尝试达到限制:

$ l
Permissions Links Size User  Group Date Modified Name
.rw-r--r--@     1   12 steve steve 20 Oct 16:35  a
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:34  b -> a
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:35  c -> b
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:35  d -> c
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:35  e -> d
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:36  f -> e
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:36  g -> f
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:36  h -> g
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:36  i -> h
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:36  j -> i
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:37  k -> i
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:37  l -> k
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:37  m -> l
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:37  n -> m
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:38  o -> n
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:38  p -> o
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:40  q -> p
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:41  r -> q
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:41  s -> r
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:41  t -> s
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:41  u -> t
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:41  v -> u
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:41  w -> v
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:41  x -> w
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:41  y -> x
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:41  z -> y
lrwxrwxrwx@     1    1 steve steve 20 Oct 16:42  z1 -> z
lrwxrwxrwx@     1    2 steve steve 20 Oct 16:42  z2 -> z1
lrwxrwxrwx@     1    2 steve steve 20 Oct 16:42  z3 -> z2
lrwxrwxrwx@     1    2 steve steve 20 Oct 16:42  z4 -> z3
lrwxrwxrwx@     1    2 steve steve 20 Oct 16:43  z5 -> z4
lrwxrwxrwx@     1    2 steve steve 20 Oct 16:43  z6 -> z5
lrwxrwxrwx@     1    2 steve steve 20 Oct 16:43  z7 -> z6
lrwxrwxrwx@     1    2 steve steve 20 Oct 16:43  z8 -> z7
lrwxrwxrwx@     1    2 steve steve 20 Oct 16:43  z9 -> z8
lrwxrwxrwx@     1    2 steve steve 20 Oct 16:43  z10 -> z9
lrwxrwxrwx@     1    3 steve steve 20 Oct 16:43  z11 -> z10
lrwxrwxrwx@     1    3 steve steve 20 Oct 16:43  z12 -> z11
lrwxrwxrwx@     1    3 steve steve 20 Oct 16:43  z13 -> z12
lrwxrwxrwx@     1    3 steve steve 20 Oct 16:44  z14 -> z13
lrwxrwxrwx@     1    3 steve steve 20 Oct 16:44  z15 -> z14
lrwxrwxrwx@     1    3 steve steve 20 Oct 16:44  z16 -> z15
lrwxrwxrwx      1    3 steve steve 20 Oct 16:45  z17 -> z16
$ cat a
You did it.

$ cat z17
cat: z17: Too many levels of symbolic links

$  cat z16
You did it.

好像我触发了这个40限制,那么那是什么8

答案1

这两个限制是限制一样的东西

8,如定义_POSIX_SYMLOOP_MAX,是 POSIX最小的每个符合 POSIX 的操作系统都必须遵循的限制。

当涉及到特定的操作系统时,操作系统可以选择不同的限制值,只要满足POSIX最小限制(即大于或等于8)。

Linux 在内核 2.6.18 之后,选择了8.在内核 4.2 中,内核的路径名解析代码被重新设计以消除递归的使用,所以现在,唯一的瓶颈限制符号链接解析的是单个路径可以使用的次数path resolution,该值为 40。因此解析路径名时遵循的符号链接的最大数量为 40

相关内容