8
votes

Valeur Windows vs. Linux GCC ARGV [0]

Dupliqué possible:
Obtenez le chemin de l'exécutable

Je suis la programmation sur Windows à l'aide de Mingw, GCC 4.4.3. Lorsque j'utilise la fonction principale comme ceci: xxx

sur Windows, je reçois un chemin complet comme ceci: "C: / Dev / Stuff / Bin / Test". Lorsque j'exécute la même application sur Linux, cependant, je reçois une sorte de chemin relatif: "bin / test". Ça brise ma candidature! Aucune idée sur la façon de vous assurer que le chemin est absolu sur les deux systèmes?


4 commentaires

Éventuellement associé: Stackoverflow.com/questions/2050961/... et Stackoverflow.com/Questtions/1528298/get-Path-of-executable


Je suis raisonnablement certain qu'il n'ya aucun moyen de garantir une telle chose. Si vous avez besoin d'une voie absolue vers l'exécutable, vous devez utiliser quelque chose d'autre que ARGV [0] pour l'obtenir.


Cela ne devrait pas fonctionner sous Windows non plus. Lancez-vous le programme de la ligne de commande ou de l'explorateur?


J'utilise un makefile. La commande Makefile est bin / test. Étrange, n'est-ce pas ...


3 Réponses :


10
votes

Non, il n'y a pas. Sous la plupart des coquillages sur Linux, argv [0] code> contient exactement ce que l'utilisateur saisit em> pour exécuter le binaire. Cela permet aux binaires de faire différentes choses en fonction de ce que les types d'utilisateurs.

Par exemple, un programme avec plusieurs commandes de ligne de commande différentes peut installer le binaire une fois, puis link dur em> les différents différents commandes au même binaire. Par exemple, sur mon système: p> xxx pré>

remarque comment certains de ces fichiers ont exactement la même taille. Plus d'enquête révèle: P>

$ stat /usr/bin/git
234881026 459240 -rwxr-xr-x 109 root wheel 0 2500640 "Oct 29 08:51:50 2011" "May 16 18:44:05 2011" "Jul 26 20:28:29 2011" "May 16 18:44:05 2011" 4096 4888 0 /usr/bin/git
$ stat /usr/bin/git-receive-pack 
234881026 459240 -rwxr-xr-x 109 root wheel 0 2500640 "Oct 29 08:51:50 2011" "May 16 18:44:05 2011" "Jul 26 20:28:29 2011" "May 16 18:44:05 2011" 4096 4888 0 /usr/bin/git-receive-pack


1 commentaires

Sans oublier que quel que soit le code qui appelle l'une des familles de fonctions EXEC * de fonctions pour exécuter votre code peut mettre tout ce qu'il veut pour argv [0] .



3
votes

Il n'y a aucun moyen de s'assurer que argv [0] est un chemin absolu car il est censé être exactement comment l'utilisateur a appelé le programme. Donc, si sur une ligne de commande Linux, vous appelez votre programme via ./ bin / test , alors argv [0] devrait être exactement "./ bin / test ".

Cela semble être un bogue dans l'exécution de Mingw si lorsque vous invoquez le programme à partir d'une invite de commande via . \ bin \ test , argv [0] est "C: / Dev / Stuff / Bin / Test" . Avec la dernière MINGW (Version GCC 4.5.2), appeler une binaire via . \ Bin \ test signifie argv [0] est ". \ Bin \ test ". Un binaire (CL version 16.00.40219.01 de Microsoft Visual C ++) invoqué via . \ Bin \ test a aussi ". \ Bin \ test" pour argv [ 0] .


4 commentaires

Il est censé être exactement comment l'utilisateur a invoqué le programme. Sauf si c'est une coquille de connexion, qui aura une tiret préparée.


La norme C (5.1.2.2.1P2) dit "Si la valeur de l'Argc est supérieure à zéro, la chaîne pointée par ARGV [0] représente le nom du programme "; Il est délibérément pas clair sur ce que le "nom du programme" est ou comment argv [0] "représente". POSIX dit essentiellement que argv [0] est tout ce qui a été transmis à la fonction EXEC * () lorsque le programme a été invoqué - ce qui signifie qu'il apparaît à la coquille invoquant.


@ninjalj: Je ne le savais pas. C'est intéressant :)


@KeithThompson: D'accord, donc ce n'est pas un bug mingw. Bon à savoir.



4
votes

Argv Array

argv [0] code> est un paramètre comme des autres: il peut s'agir d'une chaîne d'octets terminée nul arbitraire. Il peut s'agir de la chaîne vide. Il est quel que soit le processus de lancement. Strong> p>

Par défaut, la coquille avec jeu argv [0] code> à tout ce qui est utilisé pour nommer le programme: a Nom Recherche dans $ chemin code>, un relative ou un chemin absolu. Il peut s'agir d'un lien symbolique ou d'un fichier régulier. P>

Pour appeler un programme avec une autre valeur, avec ZSH (Dunno avec d'autres coquilles) Utilisez: P>

ARGV0=whatever_you_want some_program arguments


0 commentaires