c - 从 C 中的符号链接(symbolic link)调用时如何使用 getcwd 获取可执行路径

标签 c linux file-io symlink

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

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

直接调用abc时,该路径返回abc所在的路径。

如果我创建一个指向 abc 的符号链接(symbolic link),并调用符号链接(symbolic link),currentPath() 返回符号链接(symbolic link)的路径。

有没有办法让这个方法返回abc的路径?我有兴趣访问与 abc 位置相关的文件。

最佳答案

您不能使用getcwd() 来帮助获取可执行文件名;这不是查找可执行文件路径名的明智方法。

在 Linux 上,有一个符号链接(symbolic link) /proc/self/exe,如果您使用 readlink() 读取它,它会为您提供可执行文件的名称。系统调用。当心,readlink() 系统调用不会 null 终止它返回的值(我不知道为什么不这样做;这在我的书中是非常奇怪的行为,并且是粗心者立即导致错误的原因).

你的方案有很多问题。

  1. 如果程序是通过 $PATH 找到的,则不能保证当前目录与包含可执行文件的目录相同。如果您考虑一下,您可以运行 /bin/ls 而不必在 /bin 目录中。
  2. 如果您担心安全问题,请注意 argv[0] 的值受启动目标程序的程序控制。外壳表现得很好;其他程序可能更具恶意:

    #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/

相关文章:

c - 当我们使用 while 循环时找出程序的复杂性

linux - 我的 lib_LTLIBRARIES 库链接,但 check_LTLIBRARIES 没有链接?

python - 在 Fedora Linux 上的 Jupyter 中运行 Python 2 和 3

c - 运算符(operator) !!在内核 C

c - 添加来自 3 个不同 CSV 列的数字

java - 将 C 或 C++ 常量转换为 Java

Linux shell 脚本

linux - 如何从 Haskell 为所有用户设置文件权限

linux - 如何使用 poll linux 函数调用来使用静态文件描述符?

java - Java 中的文件写入与内存存储