假设我在 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 终止它返回的值(我不知道为什么不这样做;这在我的书中是非常奇怪的行为,并且是粗心者立即导致错误的原因).
你的方案有很多问题。
- 如果程序是通过 $PATH 找到的,则不能保证当前目录与包含可执行文件的目录相同。如果您考虑一下,您可以运行
/bin/ls
而不必在/bin
目录中。 如果您担心安全问题,请注意
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/