LinuxWindows系统路径长度限制,PATH_MAXMAX_PATH内能建多长路径?

摘要:问题的提出 在处理文件系统路径的时候,我们一般会先开辟一块内存区,用来接收路径、或者拼接好路径传递给系统调用。这是因为路径在各个系统上都有最大长度限制,在 Windows 上这个值是 MAX_PATH,一般不能超过 260;在 Linux
问题的提出 在处理文件系统路径的时候,我们一般会先开辟一块内存区,用来接收路径、或者拼接好路径传递给系统调用。这是因为路径在各个系统上都有最大长度限制,在 Windows 上这个值是 MAX_PATH,一般不能超过 260;在 Linux 上这个值是 PATH_MAX,一般不能超过 4096 (或者通过 pathconf (_PC_PATH_MAX, ...) 来获取,但是一般也是 4096),就像下面这段典型的代码: 1 int main () 2 { 3 #ifdef WIN32 4 char buf[MAX_PATH + 1] = { 0 }; 5 if (GetModuleFileNameA(NULL, buf, MAX_PATH) == 0) 6 { 7 printf("get current module path failed, errno %d", GetLastError()); 8 return -1; 9 } 10 #else 11 char buf[PATH_MAX + 1] = { 0 }; 12 if (readlink("/proc/self/exe", buf, PATH_MAX) < 0) 13 { 14 printf("read exe path failed, errno %d", errno); 15 return -1; 16 } 17 #endif 18 19 printf("current executable file path: %s\n", buf); 20 return 0; 21 } 它用来获取当前可执行文件的完整路径。在 Windows 与 Linux 上分别调用了 GetModuleFileName 与 readlink 系统调用,且事先在栈上分配了接收完整路径的内存区 buf。最后将成功获取的路径打印到控制台。在两种系统上,输出分别如下: Windows current executable file path: E:\code\apue\02.chapter\Release\path_max.exe Linux current executable file path: /home/yunhai/code/apue/02 .chapter /path_max 其它与路径相关的调用也是类似的。那么问题来了,这个最大路径长度是为了方便程序编写 (不然需要动态分配内存,且需要两次调用,其中一次用于获取最终的路径长度),还是说底层的文件系统就只能支持这么长的路径呢? 问题的验证 为了弄清楚这个问题,我专门写了一个测试程序: path_max.c 1 #ifdef WIN32 2 # ifndef _WIN32_WINNT // 指定要求的最低平台是 Windows Vista。 3 # define _WIN32_WINNT 0x0600 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
阅读全文