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