GNU/Linux >> Znalost Linux >  >> Linux

Může spustitelný soubor objevit svou vlastní cestu? (Linux)

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.


Linux
  1. Jak mohu vytvořit strom adresářů v C++/Linux?

  2. Jak mohu symbolicky propojit soubor v Linuxu?

  3. Vložení ikony do spustitelného souboru Linux

  1. pomocí linuxu, jak mohu předat obsah souboru jako parametr spustitelnému souboru?

  2. může program číst vlastní elfí sekci?

  3. Mohu hrát Dota 2 na Linuxu?

  1. Může Bash zapisovat do svého vlastního vstupního streamu?

  2. Mohu přidat zkratku pro nahrazení cesty v Linuxu?

  3. Jak mohu upravit $PATH na linuxu?