Unix 为文件系统定义路径_MAX?

Unix 为文件系统定义路径_MAX?,unix,filesystems,posix,fuse,Unix,Filesystems,Posix,Fuse,我目前正在编写一个文件系统。结构(甚至是statfs)包含一个字段,指定该路径中名称的最大长度。由于PATH_MAX是在manpage()中定义的,这意味着它是在每个目录的基础上定义的(因此,由底层文件系统确定)。如何指定此值?PATH\u MAX是一个系统范围的设置,通常在pathmax.h中定义为: define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 \ : pathconf ("/", _PC_PA

我目前正在编写一个文件系统。结构(甚至是
statfs
)包含一个字段,指定该路径中名称的最大长度。由于
PATH_MAX
是在manpage()中定义的,这意味着它是在每个目录的基础上定义的(因此,由底层文件系统确定)。如何指定此值?

PATH\u MAX是一个系统范围的设置,通常在pathmax.h中定义为:

define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 \
            : pathconf ("/", _PC_PATH_MAX))
define PATH_MAX(pathconf(“/”,_PC_PATH_MAX)<1?1024\
:pathconf(“/”,\u PC\u PATH\u MAX))

PATH\u MAX
主要作为文件系统函数调用接口的一个属性,因此我认为在不同目录中使用不同的路径没有多大意义

例如,重命名或移动包含大型目录树的目录可能会使最长的绝对路径名变长,限制这一点既复杂又低效


相反,
PATH_MAX
允许内核将传递的路径名复制到临时未分页内存中,这样就可以在每次访问时无需考虑页面错误的情况下对其进行处理。分配大量这样的内存可能会阻止内核正在做的大多数其他事情,甚至导致内核恐慌。

我对其他操作系统的了解不够,但我认为这至少是FreeBSD 5.2.1中的系统范围设置

路径_MAX位于#62
sys/syslimits.h


因为返回ufs FS的
pathconf
信息的
static int ufs_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 */
}

在Linux上,glibc的
pathconf
实现返回一个编译时常量PATH_MAX,因此没有运行时magic FUSE或其他任何人可以对其进行调整。(请参阅sysdeps/unix/sysv/linux/pathconf.c,该文件属于sysdeps/posix/pathconf.c)您的问题“如何指定文件系统的路径_MAX?”的答案是“您不能。glibc不允许您,FUSE只是信使。”

最终结果是一个棘手的局面。依赖路径长度不超过PATH_MAX的软件很久以前就被其他文件系统破坏了,所以忽略PATH_MAX是安全的

在MacOS X(可能还有其他BSD)上:
pathconf
的实现完全在内核中,可以在每个文件系统中进行交换。OSXFUSE包含一个NOOP版本的pathconf,它应该返回通常的编译时常量。然而,在我的测试中,它似乎捕获了另一个NOOP函数,返回一个ENXIO,我无法让pathconf工作


额外好处:对于NAME\u MAX,

POSIX允许
\u PC\u PATH\u MAX
根据当前目录变化,但这并不意味着不改变它的系统不符合要求

PATH\u MAX
存在的真正原因是内核在对路径名进行任何实际操作之前将其复制到kernelspace中


您断言在
statvfs
中存在与
PATH\u MAX
相关的字段是错误的。这与
NAME\u MAX
有关,这是另一回事。

因为这个问题被标记为“FUSE”

我在处理FUSE文件系统时遇到了这个问题。我给FUSE开发者写了一封电子邮件,寻求澄清。当前
libfuse
维护者的回复(2018年1月):没有办法指定FUSE文件系统[driver]中的最大路径长度

FUSE文件系统是否有一种方法来通知运行在其顶部的软件 关于正确的最大路径长度

现在不行

如果没有,是否应该有

可能是的。欢迎光临:-)


作为参考:

我认为pathmax.h是某种mac故障。上面提到的PATH_MAX macro/pathmax.h是MacOS X附带的旧BSD
sort
命令行实用程序的一部分,不是内核或标准C库的一部分。POSIX不同意您的观点-问题是正确的,函数可以根据需要返回不同的值在传递给它的文件名上,这意味着它可以根据该目录所表示的文件系统而变化。然而,POSIX也说:返回的值不应比使用实现的
编译时应用程序可用的相应值更严格。我认为每个目录不同的
{PATH\u MAX}
值适用于用户模式的文件系统实现(不是fuse,而是open()解释同一地址空间中的名称)。即使如此,应用程序也不能使用不同的值来避免竞争(如果它们为每个组件调用
pathconf()
)。此外,当
{PATH\u MAX}
不是常量时,使用非空缓冲区指针调用
realpath()
之类的东西会变得未定义,但这并不拒绝接受更长路径名的实现。不-它是每个目录的原因是,这是应用程序查找文件系统属性的最简单方法,无需跟踪装入点和文件系统类型本身。所以目录/可以是不同于/cdrom的fs,但是应用程序只需要查看目录。很明显,这个值应该是可定制的,但实际上它似乎没有实际应用。这是我第二次或第三次对这个进行悬赏。任何人这是我第四次执行这项赏金。