如果我更改 limit.h 中的 PATH_MAX 和 NAME_MAX 会发生什么?

如果我更改 limit.h 中的 PATH_MAX 和 NAME_MAX 会发生什么?

Linux内核PATH_MAXNAME_MAX.limits.conf

如果我增加这些常量并重新编译内核会发生什么?

另外,我相信我必须更改它/usr/include/linux/limits.h并重新编译 libc (以及包含标头的任何程序)。

  1. 我可以创建具有更长路径/名称的文件吗?
  2. 如果我在另一个系统上挂载具有这些长文件名的文件系统会发生什么?

对于问题 2:我知道内核会阻止您创建路径大于PATH_MAX.但是,我想知道当文件系统本身为其提供的路径长于该路径时(例如在 后ls),它如何处理。

答案1

  1. 已经可以创建具有更长路径的文件。通过使用相对路径、更改安装点等,您可以创建绝对路径长于 的文件PATH_MAX,并且内核已经知道如何处理它。增加PATH_MAX(在include/uapi/linux/limits.h, 不是limits.conf)将增加您一次可以处理的最大路径长度。著名的赫德甚至没有定义PATH_MAX

    增加NAME_MAX不一定有多大帮助,因为您会遇到文件系统限制; Linux 上使用的大多数文件系统仅支持 255 字节组件名称

  2. 如上所述,更长的路径已经成为现实,Unix 风格的系统可以处理它们(使用相对路径、符号链接等)。更长名字也可能发生,并且诸如readdir被记录为能够返回比预期最大值更长的名称。

也可以看看Linux 在多大程度上支持超过 255 字节的文件名?

另请注意,程序不应使用 中的构建时常量limits.h,它们应使用以下方式查询限制pathconf。不幸的是,情况并非总是如此,并且当写入用户空间程序提供的没有指定长度的缓冲区时,您很可能会遇到内核假设较大值 和 的问题PATH_MAXNAME_MAX

相关内容