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

标签 c++ inetd

在另一个问题中,答案是在带有 /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/

相关文章:

java - 如何通过xinetd从java服务器获取客户端IP?

c++ - 为什么 gdb 不能附加到由 inetd 调用的服务器应用程序?

c++ - Visual Studio 2013 中右值引用的初始化捕获

c - 从套接字描述符恢复 IP/端口

c++ - 为什么当管道写入 stdout 时 write() 到管道退出程序?

ssh - 通过不安全的连接发送加密 key 的方法?

c++ - MergeSort 用于 double vector

c++ - 如何使用Opencv轮廓单向描述线点

c++ - 在将大小较大的 vector move 到容量较小的 vector 之前,是否可以通过使用 reserve() 来提高代码性能?

c++ - 使用多态存档 boost 序列化