在另一个问题中,答案是在带有 /proc
的 Unix 上,真正直接可靠的方法是 readlink("/proc/self/exe", buf, bufsize)
然后它继续提供备份解决方案,如下所示:
在没有/proc 的 Unix 上(即如果上述失败):
- 如果 argv[0] 以“/”(绝对路径)开头,这就是路径。
- 否则,如果 argv[0] 包含“/”(相对路径),则将其附加到 cwd(假设尚未更改)。
getcwd(buf, bufsize); strncat(buf, "/", bufsize-strlen(buf)-1); strncat(buf, argv[0], bufsize-strlen(buf)-1);
- 否则在
$PATH
的目录中搜索可执行文件argv[0]
。
之后检查可执行文件是否实际上不是符号链接(symbolic link)可能是合理的。如果它是相对于符号链接(symbolic link)目录解析的。
不幸的是,就我而言,以上方法均无效:
/proc/self/exe 存在
但由于权限被拒绝 errno 13 而无法readlink()
。argv[0]
没有绝对或相对路径的/
。$PATH
不包含在argv[0]
中找到的可执行文件。
似乎在运行 sgid 应用程序时也会遇到此问题。在我的例子中,它不是 sgid,而是 inetd 启动。
最佳答案
解决这个问题的最好方法是在/etc/xinetd.d/myApp 配置文件中添加一个环境变量来指定二进制文件的位置,如下所示:
service myApp
{
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/local/bin/myAppd
env = MY_APP_HOME=/usr/local/bin
port = 2354
disable = no
}
然后,如果/proc/self/exe 的权限被拒绝,检查环境变量并改用它。
关于c++ - 当正常方法失败时如何在 Linux 上找到可执行文件的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1604132/