1. ホーム
  2. c++

[解決済み] C言語で実行ファイルの場所を見つけるにはどうしたらいいですか?[重複]する

2022-04-25 08:12:30

質問

C/C++で、現在実行されているプログラムの場所(フルパス)を見つける方法はありますか?

(の問題)。 argv[0] は、フルパスが与えられないということです)。

解決方法は?

まとめると

  • のあるUnixでは /proc は、本当にストレートで現実的な方法です。

    • readlink("/proc/self/exe", buf, bufsize) (リナックス)

    • readlink("/proc/curproc/file", buf, bufsize) (FreeBSD)

    • readlink("/proc/self/path/a.out", buf, bufsize) (ソラリス)

  • がないUnixの場合 /proc (つまり、上記が失敗した場合)。

    • argv[0] が "/" (絶対パス)で始まる場合、このパスが使用されます。

    • それ以外の場合、argv[0] に "/" (相対パス)が含まれていれば、それを cwd に追加します。 (まだ変更されていないと仮定して)。

    • にあるディレクトリを検索します。 $PATH 実行可能な argv[0] .

    その後、実行ファイルが実際にシンボリックリンクでないかどうかをチェックするのが妥当でしょう。 もしそうなら、シンボリックリンクのディレクトリに相対的に解決してください。

    このステップは、/procメソッドでは必要ありません(少なくともLinuxの場合)。 そこでは proc シンボリックリンクは実行ファイルを直接指しています。

    を設定するのは、呼び出し側のプロセス次第であることに注意してください。 argv[0] を正しく表示します。 ほとんどの場合は正しいのですが、呼び出し元のプロセスが信頼できない場合もあります (例: setuid executable)。

  • Windowsの場合 GetModuleFileName(NULL, buf, bufsize)