GNU/Linux >> Linux Esercitazione >  >> Linux

Un eseguibile può scoprire il proprio percorso? (Linux)

Bene, devi usare getcwd() in combinazione con argv[0] . Il primo ti dà la directory di lavoro, il secondo ti dà la posizione relativa del binario dalla directory di lavoro (o un percorso assoluto).


Modifica: È stato sottolineato che l'utilizzo di /proc/self/exe è più semplice. Questo è del tutto vero, ma non ho visto alcun vantaggio nella modifica del codice. Dato che ricevo ancora commenti al riguardo, l'ho modificato.

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

Risposta iniziale: Puoi usare getpid() per trovare il pid del processo corrente, quindi leggere /proc/<pid>/cmdline (per un lettore umano) o /proc/<pid>/exe che è un collegamento simbolico al programma vero e proprio. Poi, usando readlink(), puoi trovare il percorso completo del programma.

Ecco un'implementazione in 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;
}

Se vuoi provare, puoi quindi compilare questo, creare un collegamento simbolico dall'eseguibile a un altro percorso e chiamare il collegamento:

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

Usa il filesystem proc

Il tuo flusso sarebbe:

  • Ottieni pid dell'eseguibile
  • guarda /proc/PID/exe per un collegamento simbolico

Il file /proc/self/exe è un simlink all'eseguibile attualmente in esecuzione.


Linux
  1. Come posso generare un elenco di file con il loro percorso assoluto in Linux?

  2. Come posso creare un albero di directory in C++/Linux?

  3. Come posso collegare simbolicamente un file in Linux?

  4. Incorporamento di un'icona in un eseguibile Linux

  5. usando Linux come posso passare il contenuto di un file come parametro a un eseguibile?

13 modi in cui puoi aiutare Linux

Come rendere eseguibile un file in Linux

Kernel Linux e le sue funzioni

Linux:aggiungi una directory a PATH

Come posso modificare $ PATH su Linux?

Come posso eseguire un eseguibile non attendibile su Linux in modo sicuro?