假设我在Linux中有一个程序abc,它有一个方法:

char *currentPath(){
        char *path=NULL;
        path = getcwd(path, MAXPATHLEN);
        return path;
}

当直接调用abc时,此路径返回abc所在的路径。
如果我建立到abc的符号链接并调用符号链接,currentPath()将返回符号链接的路径。
有没有办法让这个方法返回abc的路径?我对访问与abc位置相关的文件感兴趣。

最佳答案

您不能使用getcwd()来帮助获取可执行文件名;这不是一种寻找可执行文件路径名的明智方法。
在Linux上,如果您使用/proc/self/exe系统调用读取可执行文件,则有一个符号链接readlink()为您提供可执行文件的名称。当心,readlink()系统调用不会空终止它返回的值(我也不知道为什么不这样做;这是我书中奇怪的行为,也是粗心者出现错误的一个瞬间原因)。
你的计划有很多问题。
如果通过$path找到程序,则不能保证当前目录与包含可执行文件的目录相同。如果考虑一下,您可以运行/bin/ls而不必在/bin目录中。
如果您担心安全性,请注意argv[0]的值由启动目标程序的程序控制。shell的行为很好;其他程序可能更恶意:

#include <unistd.h>
int main(void)
{
    char *argv[] = { "/opt/you/bin/bogus", "300", 0 };
    execvp("sleep", argv);
    return(-1);
}

这会将程序名传递为/opt/you/bin/bogus,即使它调用程序sleep
如果你在网上搜索,你会发现很多“如何获取可执行文件名”的例子,它们假设argv[0]是一条路,而不是。其他平台还有其他获取可执行文件名的技术。使用/proc/self/exe不是可移植的;其他技术也不是。

关于c - 从C中的符号链接(symbolic link)调用时如何使用getcwd获取可执行路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11920107/

10-10 06:47