Linuxの場合、アプリケーションは/proc/self/exe
を照会することで簡単に絶対パスを取得できます。 FreeBSDでは、sysctl呼び出しを構築する必要があるので、もっと複雑です。OS Xコマンドラインアプリケーションの絶対パスをプログラムで取得する
int mib[4];
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_PATHNAME;
mib[3] = -1;
char buf[1024];
size_t cb = sizeof(buf);
sysctl(mib, 4, buf, &cb, NULL, 0);
しかし、まだ完全に実行可能です。しかし、私はコマンドラインアプリケーションのためにこれをOS Xで判断する方法を見つけることができません。アプリケーションバンドルから実行している場合は、[[NSBundle mainBundle] bundlePath]
を実行して確認できますが、コマンドラインアプリケーションはバンドルに含まれていないため、これは役に立ちません。
(注、シンボリックリンクから起動した場合、argv[0]
はそのシンボリックリンクになりますので、argv[0]
に相談することは、合理的な答えではない - ではないと呼ばれる実行可能ファイルへの究極のパスargv[0]
をもうそできダムアプリケーションがexec()
を使用している場合。 argvを正しく初期化することを忘れてしまいました。
argv [0]を読むことは解決策であり、このスレッドでは何も私には納得できません。 – bortzmeyer
@bortzmeyer: 'execl("/home/hacker/.hidden/malicious "、"/bin/ls "、" -s "、(char *)0);' - argv [0] 'の値''/bin/ls ''ですが、これは実行可能ファイルの名前とは関係ありません。 –