GNU/Linux >> Belajar Linux >  >> Linux

Bisakah sebuah executable menemukan jalannya sendiri? (Linux)

Nah, Anda harus menggunakan getcwd() bersamaan dengan argv[0] . Yang pertama memberi Anda direktori kerja, yang kedua memberi Anda lokasi relatif biner dari direktori kerja (atau jalur absolut).


Edit: Ditunjukkan bahwa menggunakan /proc/self/exe lebih lugas. Itu sepenuhnya benar, tetapi saya tidak melihat manfaat apa pun dalam mengedit kode. Karena saya masih mendapatkan komentar tentangnya, saya telah mengeditnya.

#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;
}

Jawaban awal: Anda dapat menggunakan getpid() untuk menemukan pid dari proses saat ini, lalu membaca /proc/<pid>/cmdline (untuk pembaca manusia) atau /proc/<pid>/exe yang merupakan symlink ke program yang sebenarnya. Kemudian, dengan menggunakan readlink(), Anda dapat menemukan jalur lengkap dari program tersebut.

Berikut adalah implementasi di 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;
}

Jika Anda ingin mencoba, Anda kemudian dapat mengkompilasi ini, membuat symlink dari yang dapat dieksekusi ke jalur lain, dan memanggil tautannya:

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

Gunakan sistem file proc

Alur Anda akan menjadi:

  • Dapatkan pid dari yang dapat dieksekusi
  • lihat /proc/PID/exe untuk symlink

File /proc/self/exe adalah simlink ke executable yang sedang berjalan.


Linux
  1. Bagaimana saya bisa membuat pohon direktori di C++/Linux?

  2. Bagaimana saya bisa menghubungkan file di Linux?

  3. Menyematkan ikon di executable Linux

  1. Apa itu inode anonim di Linux?

  2. dapatkah suatu program membaca bagian elfnya sendiri?

  3. Bagaimana saya bisa mencari file dengan nama dan jalur parsialnya?

  1. Bisakah Bash Menulis Ke Aliran Inputnya Sendiri?

  2. Bagaimana saya bisa membuat daftar file dengan jalur absolutnya di Linux?

  3. Bagaimana saya bisa menjalankan executable yang tidak dipercaya di linux dengan aman?