PATH_MAX和NAME_MAX之间有什么关系,我该如何获取它们?

6
limits.h中,以及在POSIX手册的各个地方,都有关于PATH_MAXNAME_MAX的引用。 它们之间有什么关系? 官方文档在哪里可以找到? 如何在C、Python和GNU(shell)环境下在运行时和(相关情况下)编译时获取它们?
1个回答

7

PATH_MAX是文件系统路径的最大长度。 NAME_MAX是文件名(在特定位置)的最大长度。因此,/foo/bar受到PATH_MAX的限制,而只有bar部分的长度受到NAME_MAX的限制。

您可以通过pathconf在运行时获取它们,作为_PC_PATH_MAX_PC_NAME_MAX,尽管标准做法通常只是在编译时使用静态宏。我想使用运行时选项可能更好,因为这样您可以潜在地支持更长的值,但我不确定是否有任何系统实际上提供了大于POSIX_FOO_MAX值的pathconf返回值。


你能否评论一下它们是否在Python中可用,以及在哪里可以找到? - Matt Joiner
@Matt Joiner:你的问题只适用于C语言;Python或shell脚本没有“编译时间”。如果你使用的是脚本语言,这些变量对你也不太有用——只需使用无限长度的字符串来操作路径即可。此外,这些变量是特定于系统的,Python脚本应该是可移植的,因此你可能不想使用它们,而是在创建/访问文件时检查“路径过长”错误。 - Borealid
2
我正在用Python编写一个文件系统,所以它们实际上非常有趣。我在我的设备文件上调用os.fpathconf作为PATH_MAX的最佳猜测,并且NAME_MAX是通过struct statvfs返回的我的实现属性。尽管缺少Python提示,但这是一个很好的答案。 - Matt Joiner
大多数操作系统都支持在早期版本的OS上编译的代码执行(甚至在完全不同的OS上)。如果其中一个值在OS更新期间发生更改,则在运行时调用pathconf将为您提供适用于您正在运行的内核/ libc的正确(更新)值,而不是适用于您编译的内核/ libc的不正确(过时)值。显然,重新编译以适应新运行时表面上是更可取的,但在特定情况下并非总是可能或理想的。 - dgc
1
看起来 POSIX 积极禁止超过 NAME_MAX 的路径组件:pubs.opengroup.org/onlinepubs/9699919799/basedefs/…:“如果任何路径名组件的长度超过 {NAME_MAX},则实现应将其视为错误。” - Petr Skocik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接