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
Fabien LE LEZ <gramster@gramster.com> wrote in message
news:<4529b0lkj4874ao8rr2m8214t304bi1o8v@4ax.com>...
On Wed, 26 May 2004 14:00:15 +0200, Toto <toto@toto.com> 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
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
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
kanze@gabi-soft.fr 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 ""
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
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
Loïc Joly <loic.actarus.joly@wanadoo.fr> wrote in message
news:<c95spo$mv8$1@news-reader4.wanadoo.fr>...
kanze@gabi-soft.fr 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
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