gpt4 book ai didi

c++ - 当正常方法失败时如何在 Linux 上找到可执行文件的位置?

转载 作者:行者123 更新时间:2023-11-28 08:31:54 26 4
gpt4 key购买 nike

在另一个问题中,答案是在带有 /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)目录解析的。

不幸的是,就我而言,以上方法均无效:

  1. /proc/self/exe 存在 但由于权限被拒绝 errno 13 而无法 readlink()
  2. argv[0] 没有绝对或相对路径的 /
  3. $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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com