GNU/Linux >> Tutoriels Linux >  >> Linux

Un exécutable peut-il découvrir son propre chemin ? (Linux)

Eh bien, vous devez utiliser getcwd() en conjonction avec argv[0] . Le premier vous donne le répertoire de travail, le second vous donne l'emplacement relatif du binaire à partir du répertoire de travail (ou un chemin absolu).


Modifier : Il a été souligné que l'utilisation de /proc/self/exe est plus direct. C'est tout à fait vrai, mais je n'ai vu aucun avantage à modifier le code. Comme je reçois encore des commentaires à ce sujet, je l'ai modifié.

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

Réponse initiale : Vous pouvez utiliser getpid() pour trouver le pid du processus en cours, puis lire /proc/<pid>/cmdline (pour un lecteur humain) ou /proc/<pid>/exe qui est un lien symbolique vers le programme réel. Ensuite, en utilisant readlink(), vous pouvez trouver le chemin complet du programme.

Voici une implémentation en 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;
}

Si vous voulez essayer, vous pouvez ensuite le compiler, créer un lien symbolique de l'exécutable vers un autre chemin et appeler le lien :

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

Utiliser le système de fichiers proc

Votre flux serait :

  • Obtenir le pid de l'exécutable
  • regardez /proc/PID/exe pour un lien symbolique

Le fichier /proc/self/exe est un lien vers l'exécutable en cours d'exécution.


Linux
  1. Comment puis-je créer une arborescence de répertoires en C++/Linux ?

  2. Comment puis-je lier symboliquement un fichier sous Linux?

  3. Obtenir l'adresse IP d'une interface sous Linux

  4. Qu'est-ce qu'un inode anonyme sous Linux ?

  5. Comment obtenir le chemin d'accès au fichier actuel (pwd) sous Linux à partir de C ?

13 façons d'aider Linux

Comment rendre un fichier exécutable sous Linux

Le noyau Linux et ses fonctions

Linux :ajouter un répertoire à PATH

en utilisant Linux, comment puis-je passer le contenu d'un fichier en tant que paramètre à un exécutable ?

Comment puis-je rechercher un fichier par son nom et son chemin partiel ?