Je développe mon application sous Linux pour les plates-formes unix et win32 (cross compilation à chaque build), donc une fonction prête à l'emploi serait bien :). J'utilise glib qui a la fonction gchar* g_get_current_dir(void)
et il retourne le répertoire courant, mais ce dont j'ai vraiment besoin, c'est le répertoire de l'exécutable. Je suis inexpérimenté dans la programmation en C donc les suggestions sont les bienvenues.Comment obtenir le répertoire du programme en cours d'exécution en C en utilisant une méthode indépendante de la plateforme?
Répondre
sous Unix comme les systèmes d'exploitation qui ont le répertoire /proc
vous pouvez readlink
/proc/self/exe
pour obtenir les fichiers exécutables réels chemin complet même si argv[0]
ne dispose pas.
Cela peut toutefois ne pas fonctionner si l'exécutable a été démarré avec fexecv
(non disponible sur de nombreux systèmes) et si cela est implémenté en tant qu'appel système sur votre système. fexecv
est juste comme execve
, sauf qu'il est passé un descripteur de fichier ouvert plutôt qu'un nom de fichier à exécuter. Sous Linux, il est implémenté en appelant le execve
sur la chaîne générée par `"/proc/self /% i ", fd", donc le fichier devrait être dans le système de fichiers au démarrage du programme. Je pense que GNU/Hurd prend en charge nativement fexecve
Il est possible qu'un fichier exécutable soit renommé ou non du système de fichiers après qu'il ait été exécuté, ce qui en fait un fichier non nommé qui disparaîtra dès qu'il cessera être ouvert (dans ce contexte, l'exécution d'un fichier nécessite généralement qu'il soit ouvert par le noyau)
En combinant cela et les conditions de préprocesseur #ifdefs je pense que je peux comprendre le reste moi-même, merci. –
GetModuleFileName dans Windows. argv[0] dans linux
REMARQUE: Si vous faites la programmation multi-plateforme, vous devez également utiliser des bibliothèques de plates-formes croisées qui masquent cette couche (Qt, wxWidgets, ACE, Boost [Je ne sais pas mais je pense qu'il a quelque chose ] ...)
-1: 'argv [0]' n'est pas une méthode utile ou fiable pour obtenir le chemin dans * nix. –
Je parlais de Linux - pas unix – INS
Connaissez-vous des bibliothèques que je pourrais utiliser pour résumer cela?Comme je l'ai dit, j'utilise déjà glib, mais je n'ai trouvé aucune fonction prête à l'emploi qui me donnerait le chemin de l'exécutable –
Je ne peux pas parler aux fenêtres. Cependant, sous UNIX, une bonne partie du temps est possible, mais ce n'est pas garanti. Les raisons de ceci impliquent des appels à exec à partir d'autres programmes comme shell qui dans certaines circonstances peuvent faire du nuage où l'exécutable vit, par exemple, un chemin relatif comme "../../../mybin/exe/myprogram". La variable PATH rend également amusant de traquer un exécutable. Permettez-moi de demander: qu'est-ce que vous essayez de faire, ou, plus correctement, pourquoi avez-vous besoin de savoir? IMO vous n'avez pas besoin de savoir. vous pouvez vérifier getcwd() et si vous ne courez pas dans un répertoire qui fonctionne, quittez. Cela ne devrait pas importer où votre image exécutable habite.
Voici un morceau de code qui fonctionne la plupart du temps, pas toujours!
nécessite un appel de main, en utilisant argv [0], j'utilise popen() appels à shell pour faire le code dans un petit are, popen() n'est pas toujours un bon choix, cela peut échouer s'il y a d'autres executables plus tôt dans le chemin du même nom:
char *
mypath(const char *src)
{
FILE *cmd=NULL;
static char path_2_me[PATH_MAX]={0x0};
char tmp[PATH_MAX]={0x0};
const char *basename=strrchr(src, '/');
if(basename==NULL)
basename=src;
else
basename++;
if(memcmp(src, "./", 2)==0)
sprintf(path_2_me,"%s/%s", getcwd(tmp, PATH_MAX), basename);
else
{
sprintf(tmp, "/usr/bin/which %s", basename);
cmd=popen(tmp, "r");
fgets(path_2_me, sizeof(path_2_me), cmd); /* one read only */
pclose(cmd);
/* check for what your version of which says on failure */
if(memcmp(path_2_me, "no ", 3)==0)
*path_2_me=0x0;
}
return (*path_2_me) ?path_2_me: NULL;
}
De nombreux doublons, par exemple [Obtenir le chemin de l'exécutable] (http://stackoverflow.com/questions/1528298/get-path -de-ex ecutable) –