答案 0 :(得分:3)
PATH_MAX
主要表现为文件系统函数调用接口的属性,所以我认为让它在各个目录之间变化是不合理的。
例如,重命名或移动其中包含大型目录树的目录可能会使最长的绝对路径名更长,并且限制它会很复杂且效率低下。
相反,PATH_MAX
用于允许内核将传递的路径名复制到临时未分页的内存,然后可以在不需要在每次访问时允许页面错误的情况下对其进行处理。分配大量此类内存可能会阻止内核正在执行的大多数其他操作,甚至会导致内核崩溃。
答案 1 :(得分:2)
在Linux上,glibc的pathconf
实现返回PATH_MAX的编译时常量值,因此没有运行时魔术FUSE或其他任何人可以执行调整它。 (请参阅sysdeps / unix / sysv / linux / pathconf.c,它通过sysdeps / posix / pathconf.c。)问题的答案“我如何指定文件系统的PATH_MAX?”是“你不能.Glibc不会让你和FUSE只是信使。”
最终结果是一个棘手的情况。 Here's a blog post that discusses the code that does and does not care about PATH_MAX.依赖于不超过PATH_MAX的路径的软件很久以前就已被其他文件系统破坏,因此您可以安全地忽略PATH_MAX。
在MacOS X上(可能还有其他BSD):pathconf
的实现完全在内核中,可以按文件系统进行交换。 OSXFUSE包含一个NOOP版本的pathconf,它应该返回通常的编译时常量。但是,在我的测试中,它似乎正在捕获另一个NOOP函数,它返回一个ENXIO,我无法使pathconf工作。
奖励:对于NAME_MAX,implement statfs and set f_namemax.
答案 2 :(得分:2)
POSIX允许_PC_PATH_MAX
根据当前目录而变化,但这并不意味着不改变它的系统不符合。
PATH_MAX
存在的真正原因是内核在执行任何实际工作之前将路径名复制到内核空间中。
您断言PATH_MAX
中存在与statvfs
相关的字段是错误的。这与NAME_MAX
有关,这是另一回事。
答案 3 :(得分:1)
由于这个问题被标记为" FUSE" ...
我在处理FUSE文件系统时遇到了这个问题。我给FUSE开发者写了一封电子邮件,寻求澄清。当前libfuse
维护者的回复(2018年1月):无法在FUSE文件系统[驱动程序]中指定最大路径长度。
FUSE文件系统是否有办法通知在顶部运行的软件 关于正确的最大路径长度?
暂时不,不。
如果没有,应该有吗?
可能是的。欢迎补丁: - )
答案 4 :(得分:0)
我对其他操作系统不够,但至少在FreeBSD 5.2.1中这是一个系统范围的设置
PATH_MAX可在#62 sys/syslimits.h
因为static int ufs_pathconf()
返回UFS FS的PATHCONF
信息,所以以您指定的方式使用此变量。
/*
* Return POSIX pathconf information applicable to ufs filesystems.
*/
int
ufs_pathconf(ap)
struct vop_pathconf_args /* {
struct vnode *a_vp;
int a_name;
int *a_retval;
} */ *ap;
{
switch (ap->a_name) {
.
.
.
.
case _PC_PATH_MAX:
*ap->a_retval = PATH_MAX;
return (0);
.
.
.
.
default:
return (EINVAL);
}
/* NOTREACHED */
}
答案 5 :(得分:-1)