GNU/Linux >> Linux の 問題 >  >> Linux

実行可能ファイルは独自のパスを発見できますか? (Linux)

getcwd() を使用する必要があります。 argv[0] と組み合わせて . 1 つ目は作業ディレクトリを示し、2 つ目は作業ディレクトリからのバイナリの相対位置 (または絶対パス) を示します。


編集: /proc/self/exe を使用していることが指摘されました より簡単です。それは完全に真実ですが、コードを編集しても何のメリットもありませんでした。まだコメントをいただいているので、編集しました。

#include <unistd.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>

int main()
{
  char dest[PATH_MAX];
  memset(dest,0,sizeof(dest)); // readlink does not null terminate!
  if (readlink("/proc/self/exe", dest, PATH_MAX) == -1) {
    perror("readlink");
  } else {
    printf("%s\n", dest);
  }
  return 0;
}

最初の回答: getpid() を使用して現在のプロセスの pid を見つけ、/proc/<pid>/cmdline を読み取ることができます (人間が読む場合) または /proc/<pid>/exe これは、実際のプログラムへのシンボリック リンクです。次に、readlink() を使用して、プログラムの完全なパスを見つけることができます。

C での実装は次のとおりです:

#include <sys/types.h>
#include <unistd.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>

int main()
{
  char path[PATH_MAX];
  char dest[PATH_MAX];
  memset(dest,0,sizeof(dest)); // readlink does not null terminate!
  pid_t pid = getpid();
  sprintf(path, "/proc/%d/exe", pid);
  if (readlink(path, dest, PATH_MAX) == -1) {
    perror("readlink");
  } else {
    printf("%s\n", dest);
  }
  return 0;
}

試してみたい場合は、これをコンパイルし、実行可能ファイルから別のパスへのシンボリック リンクを作成して、リンクを呼び出すことができます:

$ gcc -o mybin source.c
$ ln -s ./mybin /tmp/otherplace
$ /tmp/otherplace
/home/fser/mybin

proc ファイルシステムを使用

フローは次のようになります:

  • 実行可能ファイルの pid を取得
  • /proc/PID/exe を見てください シンボリックリンク

ファイル /proc/self/exe は、現在実行中の実行可能ファイルへの simlink です。


Linux
  1. Bashは独自の入力ストリームに書き込むことができますか?

  2. Linux で絶対パスを使用してファイルのリストを生成するにはどうすればよいですか?

  3. Linuxでファイルをシンボリックリンクするにはどうすればよいですか?

  1. Linux でインターフェイスの IP アドレスを取得する

  2. Linux の匿名 i ノードとは何ですか?

  3. CからLinuxで現在のファイル(pwd)へのパスを取得する方法は?

  1. プログラムは独自の elf セクションを読み取ることができますか?

  2. Linux で Dota 2 をプレイできますか?

  3. Linux でパスを置き換えるショートカットを追加できますか?