代码之家  ›  专栏  ›  技术社区  ›  Matt Joiner

为文件系统定义路径\u MAX?

  •  21
  • Matt Joiner  · 技术社区  · 14 年前

    我现在正在写一个文件系统。这个 statvfs (甚至是 statfs )结构包含一个字段,指定该路径中名称的最大长度。作为 PATH_MAX pathconf 手册页( getconf ),这意味着它是在每个目录的基础上定义的(因此,由底层文件系统决定)。如何指定此值?

    6 回复  |  直到 14 年前
        1
  •  2
  •   s-m-e    7 年前

    既然这个问题被标记为“保险丝”。。。

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

    FUSE文件系统有没有办法通知运行在上面的软件 关于正确的最大路径长度?

    现在不行,不行。

    如果没有,应该有吗?

    可能是的。欢迎:-)

    供参考: Full e-mail thread

        2
  •  3
  •   jilles    14 年前

    PATH_MAX

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

    路径\u最大值

        3
  •  2
  •   ldrg    11 年前

    在Linux上,glibc实现了 pathconf 返回一个编译时常量值PATH\u MAX,这样就没有运行时magic FUSE或其他任何人可以执行来调整它(请参阅sysdeps/unix/sysv/linux/pathconf.c,该文件属于sysdeps/posix/pathconf.c)您的问题“如何指定文件系统的路径\u MAX?”的答案是“您不能”。glibc不让你和FUSE只是信使。”

    最终的结果是一个棘手的局面。 Here's a blog post that discusses the code that does and does not care about PATH_MAX. 依赖路径长度不超过PATH\u MAX的软件很久以前就被其他文件系统破坏了,所以忽略PATH\u MAX是安全的。

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

    奖励:对于NAME\u MAX, implement statfs and set f_namemax.

        4
  •  2
  •   user2404501 user2404501    11 年前

    _PC_PATH_MAX 根据当前目录而变化,但这并不意味着 不要

    真正的原因是 PATH_MAX

    你的断言 路径\u最大值 -中的相关字段 statvfs NAME_MAX

        5
  •  0
  •   Lelouch Lamperouge    13 年前

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

    路径#MAX位于#62中 sys/syslimits.h


    因为 static int ufs_pathconf() 返回 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 */
    }
    
        6
  •  -1
  •   ennuikiller    14 年前

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

    define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 \
                : pathconf ("/", _PC_PATH_MAX))