C++ 当普通方法失败时,如何在Linux上找到可执行文件的位置?
在另一个问题中,答案指出,在带有C++ 当普通方法失败时,如何在Linux上找到可执行文件的位置?,c++,inetd,C++,Inetd,在另一个问题中,答案指出,在带有/proc的Unix上,真正直接可靠的方法是读链接(“/proc/self/exe”,buf,bufsize),然后它继续给出备份解决方案,如下所示: 在没有/proc的Unix上(即,如果上述操作失败): 如果argv[0]以“/”开头(绝对路径),则这是路径 否则,如果argv[0]包含“/”(相对路径),则将其附加到cwd(假设尚未更改) 否则,在$PATH目录中搜索可执行文件argv[0] 之后,可以检查可执行文件是否实际上不是符号链接。如果是,请
/proc
的Unix上,真正直接可靠的方法是读链接(“/proc/self/exe”,buf,bufsize)
,然后它继续给出备份解决方案,如下所示:
在没有/proc的Unix上(即,如果上述操作失败):
- 如果argv[0]以“/”开头(绝对路径),则这是路径
- 否则,如果argv[0]包含“/”(相对路径),则将其附加到cwd(假设尚未更改)
- 否则,在
目录中搜索可执行文件$PATH
argv[0]
/proc/self/exe存在
,但由于权限被拒绝而无法readlink()
,错误号13argv[0]
没有绝对或相对路径的/
$PATH
不包含在argv[0]
中找到的可执行文件当sgid应用程序运行时,似乎也会遇到这个问题。就我而言,这不是sgid,而是iNet的发布。我认为答案是:放弃
要求用户将安装目录(或您正在查找的任何内容)作为命令行参数传递。作为最后的手段,解析/etc/xinetd.d/myApp文件以拉出服务器行,其中包括通过inetd调用的可执行文件的完整路径。尝试从suid二进制文件中查找/proc。解决此问题的最佳方法是在/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被拒绝权限,请检查env变量并使用它。用户,客户端不知道位置。是的,我考虑过,但解决这个问题似乎有些极端。
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
}