如果 getcwd() 和 getenv(“PWD”) 不匹配怎么办?
题
我有一个正在使用的构建系统工具 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")
作品..如果没有其他解决方案,我可以使用它。
解决方案
根据 Stevens 的《UNIX 环境高级编程》圣经,第 112 页:
由于内核必须维护当前工作目录的知识,因此我们应该能够获取其当前值。不幸的是,内核为每个进程维护的只是当前工作目录的 i 节点号和设备标识。内核不维护目录的完整路径名。
抱歉,看来您确实需要以其他方式解决此问题。
其他提示
没有办法 getcwd()
确定您通过符号链接遵循的路径。基本实现 getcwd()
统计当前目录'.
',然后打开父目录'..
' 并扫描条目,直到找到与 ' 具有相同索引节点号的目录名称.
' 有。然后它向上重复该过程,直到找到根目录,此时它具有完整路径。它在任何时候都不会遍历符号链接。所以目标是 getcwd()
通过符号链接计算路径是不可能的,无论它是作为系统调用还是作为库函数实现。
最好的解决方案是确保构建系统处理包含空格的路径名。这意味着引用通过 shell 传递的路径名。C 程序不关心名称中的空格;只有当像 shell 这样的程序解释字符串时,您才会遇到问题。(根据经验,作为运行预处理器的 shell 脚本实现的编译器通常会遇到包含空格的路径名问题。)