假设我在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/