Musíte použít getcwd()
ve spojení s argv[0]
. První vám poskytne pracovní adresář, druhý vám poskytne relativní umístění binárního souboru z pracovního adresáře (nebo absolutní cestu).
Upravit: Bylo zdůrazněno, že pomocí /proc/self/exe
je přímočařejší. To je naprostá pravda, ale neviděl jsem žádnou výhodu v úpravě kódu. Protože k tomu stále dostávám komentáře, upravil jsem ho.
#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;
}
První odpověď: Můžete použít getpid() k nalezení pid aktuálního procesu a poté si přečíst /proc/<pid>/cmdline
(pro lidské čtenáře) nebo /proc/<pid>/exe
což je symbolický odkaz na skutečný program. Potom pomocí readlink() můžete najít úplnou cestu k programu.
Zde je implementace v 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;
}
Pokud to chcete zkusit, můžete to zkompilovat, vytvořit symbolický odkaz ze spustitelného souboru na jinou cestu a zavolat odkaz:
$ gcc -o mybin source.c
$ ln -s ./mybin /tmp/otherplace
$ /tmp/otherplace
/home/fser/mybin
Použijte souborový systém proc
Váš postup by byl:
- Získejte pid spustitelného souboru
- podívejte se na
/proc/PID/exe
pro symbolický odkaz
Soubor /proc/self/exe je odkaz na aktuálně spuštěný spustitelný soubor.