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.