GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Kann eine ausführbare Datei ihren eigenen Pfad entdecken? (Linux)

Nun, Sie müssen getcwd() verwenden in Verbindung mit argv[0] . Der erste gibt Ihnen das Arbeitsverzeichnis, der zweite gibt Ihnen den relativen Ort der Binärdatei aus dem Arbeitsverzeichnis (oder einen absoluten Pfad).


Bearbeiten: Es wurde darauf hingewiesen, dass die Verwendung von /proc/self/exe ist direkter. Das ist völlig richtig, aber ich habe keinen Nutzen darin gesehen, den Code zu bearbeiten. Da ich immer noch Kommentare dazu bekomme, habe ich es bearbeitet.

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

Erste Antwort: Sie können getpid() verwenden, um die PID des aktuellen Prozesses zu finden, und dann /proc/<pid>/cmdline lesen (für einen menschlichen Leser) oder /proc/<pid>/exe das ist ein symbolischer Link zum eigentlichen Programm. Dann können Sie mit readlink() den vollständigen Pfad des Programms finden.

Hier ist eine Implementierung 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;
}

Wenn Sie es versuchen möchten, können Sie dies kompilieren, einen Symlink von der ausführbaren Datei zu einem anderen Pfad erstellen und den Link aufrufen:

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

Verwenden Sie das proc-Dateisystem

Ihr Ablauf wäre:

  • PID der ausführbaren Datei abrufen
  • sehen Sie sich /proc/PID/exe an für einen Symlink

Die Datei /proc/self/exe ist ein Simlink auf die aktuell laufende ausführbare Datei.


Linux
  1. Wie kann ich unter Linux eine Liste von Dateien mit ihrem absoluten Pfad erstellen?

  2. Wie kann ich eine Datei unter Linux symbolisch verknüpfen?

  3. Einbetten eines Symbols in eine ausführbare Linux-Datei

  4. Rufen Sie die IP-Adresse einer Schnittstelle unter Linux ab

  5. Wie kann ich unter Linux den Inhalt einer Datei als Parameter an eine ausführbare Datei übergeben?

13 Möglichkeiten, wie Sie Linux helfen können

Wie man eine Datei unter Linux ausführbar macht

Linux-Kernel und seine Funktionen

Linux:Fügen Sie PATH ein Verzeichnis hinzu

Wie kann ich eine Datei anhand ihres Namens und Teilpfads suchen?

Wie kann ich eine nicht vertrauenswürdige ausführbare Datei sicher unter Linux ausführen?