別の質問では、答えは、を使用する Unix/proc
では、本当に直接的で信頼できる方法は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]
。
その後、実行可能ファイルが実際にシンボリック リンクではないかどうかを確認するのが妥当な場合があります。それがシンボリックリンクディレクトリに対して相対的に解決されている場合。
私の場合、残念ながら、上記のいずれも機能しません。
/proc/self/exe exists
readlink()
しかし、許可が拒否されたために失敗します errno 13.- には、絶対パスまたは相対パス
argv[0]
はありません。/
- には
$PATH
、 にある実行可能ファイルが含まれていませんargv[0]
。
この問題は、sgid アプリケーションの実行時にも発生するようです。私の場合、sgid ではなく、inetd の起動です。