处理过多的路径分隔符

时间:2014-03-05 16:02:57

标签: c linux unix path posix

我想知道与路径组件连接相关的问题,并考虑到由于不正确的连接引入的过度斜线(如"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"。现在,这是标准行为,我可以依赖它,还是我还应该明确检查路径组件以确保它们格式正确?

2 个答案:

答案 0 :(得分:4)

这是标准(POSIX,2004):

  

3.266路径名

     

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

2013版本具有类似的措辞,但确定了确切的路径名//(两个斜线,没有别的)实现。

答案 1 :(得分:1)

除了Jens' answer

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

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