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()
    ,错误号13
  • argv[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
    }