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/exean für einen Symlink
Die Datei /proc/self/exe ist ein Simlink auf die aktuell laufende ausführbare Datei.