我正在阅读《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