main(...)
Le lancement d'un programme C provoque l'appel de sa fonction principale
main(...)
qui a 3 paramètres optionnels:
argc
: nombre de paramètres sur la ligne de commande
(y compris le nom de l'exécutable lui-même) ;argv
: tableau de chaînes contenant les paramètres de la ligne de commande ;envp
: tableau de chaînes contenant les
variables d'environnement au moment de l'appel, sous la forme
variable=valeur
. Remarque
argc, argv, envp
sont
purement conventionnels.envp
est déconseillé. Voir plus loin getenv()
.Exemple :
1 /*
2 * env.c
3 * consultation des variables d'environnement via le troisième
4 * paramètre de main().
5 * Cette pratique est considérée comme obsolète,
6 * utiliser plutôt getenv()
7 */
8 #include <stdio.h>
9 #include <stdlib.h>
10 int main(int argc, char *argv[], char *envp[])
11 {
12 int k;
13 printf("Appel avec %d paramètres\n", argc);
14 for (k = 0; k < argc; k++)
15 printf(" %d: %s\n", k, argv[k]);
16 printf("Variables d'environnement\n");
17 for (k = 0; envp[k] != NULL; k++)
18 printf(" %d: %s\n", k, envp[k]);
19 exit(EXIT_SUCCESS);
20 }
getopt()
: analyse de paramètres de la ligne de commande
L'analyse des options d'une ligne de commande est facilité par
l'emploi de getopt()
.
#include <unistd.h>
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
getopt()
analyse le tableau de paramètres argv
à argc
éléments,
en se basant sur la chaîne de spécification d'options optstring
.
Par exemple la chaîne "vhx:y:"
déclare 4 options, les deux dernières
étant suivies d'un paramètre.
A chaque étape, optarg
retourne le nom de l'option (ou un point
d'interrogation pour une option non reconnue), et fournit
éventuellement dans optarg
la valeur du paramètre associé.
A la fin getopt
retourne -1
, et le tableau argv
a été
réarrangé pour que les paramètres supplémentaires soient stockés à partir de l'indice optind
.
1 /* essai-getopt.c */
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 int main(int argc, char *argv[])
6 {
7 char *opt_a = NULL;
8 int opt_x = 0;
9 int index;
10 char c;
11 while ((c = getopt(argc, argv, "hxa:")) != -1)
12 switch (c) {
13 case 'h':
14 printf
15 ("Help: %s [options...] parametres ... \n\n",
16 argv[0]);
17 printf("Options:\n" "-h\tCe message d'aide\n"
18 "-x\toption x\n"
19 "-a nom\t paramètre optionnel\n");
20 exit(EXIT_SUCCESS);
21 break;
22 case 'x':
23 opt_x = 1;
24 break;
25 case 'a':
26 opt_a = optarg;
27 break;
28 case '?':
29 fprintf(stderr, "Option inconnue `-%c'.\n",
30 optopt);
31 exit(EXIT_FAILURE);
32 default:
33 exit(EXIT_FAILURE);
34 };
35 printf("= option `-x' %s\n",
36 (opt_x ? "activée" : "désactivée"));
37 if (opt_a == NULL)
38 printf("= paramètre `-a' absent\n");
39 else
40 printf("= paramètre `-a' présent = %s\n", opt_a);
41 printf("%d paramètres supplémentaires\n", argc - optind);
42 for (index = optind; index < argc; index++)
43 printf(" -> %s\n", argv[index]);
44 exit(EXIT_SUCCESS);
45 }
Exemple.
% essai-getopt -a un deux trois -x quatre
= option `-x' activée
= paramètre `-a' présent = un
3 paramètres supplémentaires
-> deux
-> trois
-> quatre
La fonction getenv()
permet de consulter les variables d'environnement :
#include <stdlib.h> char *getenv(const char *name);
Exemple :
1 /* getterm.c */
2 #include <stdlib.h>
3 #include <stdio.h>
4 int main(void)
5 {
6 char *terminal = getenv("TERM");
7 printf("Le terminal est ");
8 if (terminal == NULL)
9 printf("inconnu\n");
10 else
11 printf("un %s\n", terminal);
12 exit(EXIT_SUCCESS);
13 }
Exercice : Ecrire un programme exoenv.c
qui affiche les
valeurs des variables d'environnement indiquées.
Exemple d'exécution:
% exoenv TERM LOGNAME PWD
TERM=xterm
LOGNAME=billaud
PWD=/net/profs/billaud/essais
%
Voir aussi les fonctions
int putenv(const char *string);
int setenv(const char *name, const char *value, int overwrite);
void unsetenv(const char *name);
qui permettent de modifier les variables d'environnement
du processus courant et de ses fils. Il n'y a pas de
moyen de modifier les variables du processus père.
Exercice. Écrire un petit programme pour mettre en évidence
le fait que le troisième paramètre de main(...)
indique les valeurs des
variables d'environnement au moment de l'appel, et non pas
les valeurs courantes.
exit()
: Fin de programme
Un programme se termine généralement par un appel à la fonction
exit()
:
#include <stdlib.h>
void exit(int status);
Le paramètre status
est le code de retour du processus.
On utilisera de préférence les deux constantes
EXIT_SUCCESS
et EXIT_FAILURE
définies dans
stdlib.h
.