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.