【问题标题】:Handling excessive path separators处理过多的路径分隔符
【发布时间】:2014-04-07 19:29:13
【问题描述】:

我想知道与路径组件连接相关的问题,考虑到由于连接不当引入的过多斜杠(如"foo//bar")导致路径最终无效的特殊情况。

但后来我注意到 Linux 上有一个奇怪的行为。请参阅以下内容:

#include <stdio.h>

int main(void) {
    char buf[4];
    FILE *f = fopen("/tmp/bar", "w");
    fwrite("bar", 1, 3, f);
    fclose(f);
    f = fopen("/tmp////////bar", "r");
    if (f) {
        fread(buf, 1, 3, f);
        buf[3] = '\0';
        printf("%s\n", buf);
        fclose(f);
    }
    return 0;
}

上面的程序实际上打印了bar,这意味着"/tmp////////bar"被隐式地缩减为"/tmp/bar"。现在,这是标准行为吗?我可以依赖它吗,还是应该明确检查路径组件以确保它们格式正确?

【问题讨论】:

    标签: c linux unix path posix


    【解决方案1】:

    除了Jens' answer

    在 Linux 上,path_resolution(7) 描述了内核内部用于解释文件路径的过程。

    您可以使用realpath(3) 来“规范化”C 中的某些路径(它应该“删除”大部分或全部symlink(7)-s...)。另请参阅 wordexp(3)glob(3),这可能有助于处理 shell 友好路径(例如扩展 ~/$HOME/ 和例如 a*.c ....)。

    【讨论】:

      【解决方案2】:

      这是标准(POSIX,2004):

      3.266 路径名

      用于标识文件的字符串。在 IEEE Std 1003.1-2001 的上下文中,路径名最多由 {PATH_MAX} 个字节组成,包括终止的空字节。它有一个可选的起始斜杠,后跟零个或多个用斜杠分隔的文件名。路径名可以可选地包含一个或多个尾部斜杠。多个连续的斜线被认为与一个斜线相同。

      2013 年的修订版有类似的措辞,但定义了确切的路径名 //(两个斜杠,没有别的)实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-19
        • 2014-07-29
        • 2018-04-25
        • 2011-06-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多