我有一个正在使用的构建系统工具 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 脚本实现的编译器通常会遇到包含空格的路径名问题。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top