我有一个使用getcwd()
来获取当前工作目录的构建系统工具。这很好,除了有时人们的路径中有空格,构建系统不支持。你认为你可以做一个象征性的链接:
ln -s "Directory With Spaces" DirectoryWithoutSpaces
然后开心。但不幸的是,getcwd()
解析了所有符号链接。我尝试使用getenv("PWD")
,但它并没有指向我从getcwd()
返回的相同路径。我认为,我责备make -C
没有更新环境变量。现在,getcwd()
给了我一条这样的道路:
/Users/carl/Directory With Spaces/Some/Other/Directories
getenv("PWD")
给了我:
/Users/carl/DirectoryWithoutSpaces
那么 - 是否有像getcwd()
这样的函数无法解析符号链接?
编辑:
我改变了
make -C Some/Other/Directories
到
cd Some/Other/Directories ; make
然后getenv("PWD")
工作..如果没有其他解决方案,我可以使用它。
答案 0 :(得分:6)
根据Stevens的UNIX环境中的高级编程,第112页:
由于内核必须保持对当前工作目录的了解,因此我们应该能够获取其当前值。不幸的是,每个进程的所有内核维护都是当前工作目录的索引节点号和设备标识。内核不维护目录的完整路径名。
抱歉,看起来你需要以另一种方式解决这个问题。
答案 1 :(得分:3)
getcwd()
无法通过符号链接确定您遵循的路径。 getcwd()
的基本实现统计当前目录“.
”,然后打开父目录“..
”并扫描条目,直到它找到具有相同inode编号的目录名称为止'.
'有。然后它向上重复该过程,直到找到根目录,此时它具有完整路径。它决不会遍历一个符号链接。所以让getcwd()
计算通过符号链接遵循的路径的目标是不可能的,无论是作为系统调用还是作为库函数实现。
最佳解决方案是确保构建系统处理包含空格的路径名。这意味着引用通过shell传递的路径名。 C程序不关心名称中的空格;只有当像shell这样的程序解释你遇到问题的字符串时才会这样。 (作为运行预处理器的shell脚本实现的编译器通常会遇到包含空格的路径名问题 - 从经验来讲。)