OVH Cloud OVH Cloud

Récupérer le PATH de mon application

13 réponses
Avatar
Toto
Bonjour,

je cherche à pouvoir récupérer le PATH complet de mon application en
utilisant les librairies standard du C++.

En gros, si je suis dans /home/user et que je lance ./dossier/monAppli,
j'aimerais récupérer /home/user/dossier/monAppli

Si vous aviez une idée... :-)

Bien cordialement,

Valentin

3 réponses

1 2
Avatar
kanze
Fabien LE LEZ wrote in message
news:...
On Wed, 26 May 2004 14:00:15 +0200, Toto wrote:

En gros, si je suis dans /home/user et que je lance
./dossier/monAppli, j'aimerais récupérer /home/user/dossier/monAppli


Parser argv[0] ne suffit pas ?


Selon la norme, argv[0] doit contenir le nom du programme, non le chemin
de l'executable. Comment le système trouve l'executable à partir du nom
dépend du système -- sous Unix, par exemple, tu pourrais essayer de lire
$PATH, puis émuler ce que fait le système.

Dans la pratique, argv[0] est à peu près n'importe quoi. Sous Unix, par
exemple, c'est ce que le programme qui t'invoque décide à te passer --
si c'est un shell classique, ça serait soit le nom, soit le chemin,
selon le shell, mais si ce n'est pas un shell, ça peut être à peu près
n'importe quoi.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Loïc Joly
wrote:



Selon la norme, argv[0] doit contenir le nom du programme, non le chemin
de l'executable.


Je préciserai en tant que nom du programme : Il s'agit du nom utilisé
pour invoquer le programme, et non pas d'un nom venu d'ailleur. Quand on
lance gcc, il n'y a pas dans argv[0] la chaine "The GNU Compiler
Collection". En plus, il est tout à fait légal d'avoir un argv[0] vide
(voire même pas de argv[0]) :

If argc is nonzero these arguments shall be supplied in argv[0] through
argv[argc1] as pointers to the initial characters of nullterminated
multibyte strings (NTMBSs) (17.3.2.1.3.2) and argv[0] shall be the
pointer to the initial character of a NTMBS that represents the
name used to invoke the program or ""

--
Loïc

Avatar
kanze
Loïc Joly wrote in message
news:<c95spo$mv8$...
wrote:

Selon la norme, argv[0] doit contenir le nom du programme, non le
chemin de l'executable.


Je préciserai en tant que nom du programme : Il s'agit du nom utilisé
pour invoquer le programme, et non pas d'un nom venu d'ailleur.


Seulement en C++, non en C. Et ça veut dire quoi, « invoquer un
programme » ? Sous Unix, seulement un programme peut invoquer un autre
programme, et il n'utilise pas de nom pour ça, mais le chemin de
l'exécutable. Un utilisateur passe des commandes à un « shell », qui les
interprète selon ses propres conventions ; la plupart du temps, le shell
finit par invoquer un programme (c'est la définition d'un shell, je
crois), mais pas toujours, et quand il invoque un programme, le chemin
qu'il passe au système n'a pas nécessairement grand chose à voir avec le
nom que l'utilisateur a donné. (Pense aux alias, par exemple.)

Par convention, sous Unix, les shells passe le premier mot de la
commande, *après* expansion des variables de shell, des alias, etc.,
comme argv[0]. Et le deuxième mot comme argv[1], le troisième comme
argv[2], etc. ; en fait, ils traitent tous les mots pareil.

Mais ce n'est qu'une convention, et ça ne vaut que pour les shells.
Selon la norme C++, qu'est-ce qu'il faut comme argv[0] si j'invoque le
programme en cliquant sur un bouton ? (C'est quand même le cas le plus
courant sur beaucoup de systèmes.)

Quand on lance gcc, il n'y a pas dans argv[0] la chaine "The GNU
Compiler Collection".


Ça dépend. Si j'exécute :
execl( "/usr/local/bin/gcc",
"The GNU Compiler Collection",
(char const*)NULL ) ;
dans un programme, par exemple.

Et si tu invoque « xtern -ls », quel est le nom de programme de ton
shell ? (Essaie « echo $0 » pour savoir.)

En plus, il est tout à fait légal d'avoir un argv[0] vide (voire même
pas de argv[0]) :


Selon la norme C++, c'est la seule implémentation légale. Mais
évidemment, comme nous savons tous, il n'y a pas de compilateur
conforme. Dans ce cas-ci, heureusement.

If argc is nonzero these arguments shall be supplied in argv[0]
through argv[argc1] as pointers to the initial characters of
nullterminated multibyte strings (NTMBSs) (17.3.2.1.3.2) and argv[0]
shall be the pointer to the initial character of a NTMBS that
represents the name used to invoke the program or ""


Ce qui n'est pas ce qu'il dit dans la norme C. Encore une
incompatibilité gratuite. Et une qui dans la pratique rend
l'implémentation de C++ impossible sous Unix. Je doute que c'en était
l'intention. De la norme C99 :

-- If the value of argc is greater than zero, the array members
argv[0] through argv[argc-1] inclusive shall contain pointers to
strings, which are given implementation-defined values by the
host environment prior to program startup. The intent is to
supply to the program information determined prior to program
startup from elsewhere in the hosted envirionment. [...]

-- If the avlue of argc is greater than zero, the string pointed to
by argv[0] represents the <i>program name</i>; argv[0][0] shall
be the null character if the program name is not available from
the host environment. If the value of argc is greater than one,
the strings pointed to by argv[1] through argv[argc-1] represent
the <i>program parameters</i>.

Note bien l'utilisation des italiques dans le deuxième point ; ça
signifie qu'il s'agit d'une définition de l'expression. En C, donc, le
nom du programme, c'est défini comme « la chaîne passée comme argv[0] ».
Et le premier point rend clair que le contenu réel de cette chaîne,
c'est définie par l'implémentation.

Je ne sais pas ce que disait C90 ici. (Je pourrais le vérifier ce soir,
si j'y pense ; j'ai une copie de la norme C90 chez moi.) Mais une chose
est certaine, ce que dit C99 est bien plus raisonable que ce que dit
C++.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


1 2