8.7 Arguments de la fonction main()

La structure des arguments de la fonction main() reflète la liaison entre le langage C et le système d’exploitation, en particulier le système UNIX. Dans un système de type UNIX, les paramètres de la fonction main() sont passés par le shell dans la majorité des cas. Ils sont passés par une des fonctions du type exec(3). Ces paramètres ont une structure prédéfinie. Ils sont décrits de la manière suivante :
int main(int argc,char argv[], char envp[])
Les noms argc, argv et envp sont des noms mnémoniques. Ils signifient argument count, argument values et environment pointer.

La fonction main() dispose donc toujours de trois paramètres passés par l’environnement système. Ces paramètres sont un entier et deux tableaux de pointeurs sur des caractères. La signification de ces arguments est la suivante :

argc
contient le nombre d’arguments qui ont été passés lors de l’appel du binaire exécutable (nombre de mots dans la ligne de commande) ;
argv
contient les arguments de la ligne de commande au niveau du shell. Ces arguments sont découpés en mots par le shell et chaque mot est référencé par un pointeur dans le tableau. Il y a toujours au moins un argument qui correspond au nom du binaire exécutable appelé ;
envp
contient les variables d’environnement du shell au moment de l’appel du fichier exécutable. Contrairement au premier tableau, la taille de ce deuxième tableau n’est pas donnée par un nombre de mots valides. La fin de ce deuxième tableau est donnée par un marqueur. Ce marqueur est un pointeur NULL, c’est-à-dire, un pointeur qui contient l’adresse 0. Dans ce cas, cette adresse est du type (char *) ou bien encore adresse d’un caractère.

La figure 8.5 donne la vision interne des paramètres issus de la commande :
echo essai de passage de parametres


PIC

FIGURE 8.5: Arguments de main()


Les programmes 8.1 et 8.2 donnent deux exemples d’utilisation des arguments du main et des variables d’environnement, en utilisant l’impression de chaîne de caractéres par printf() en utilisant le format %s ou en imprimant chaque caractère un-à-un, en utilisant le format %c.


1#include <stdio.h> 
2int 
3main (int argc, char argv[],char ∗∗envp) 
4
5  int i; 
6  printf("Nous␣avons␣%d␣arguments␣:␣\n",argc); 
7  for(i=0;i<argc;i++){ 
8    printf("argument␣%d␣==␣%s␣\n",i,argv[i]); 
9  } 
10  printf("Nous␣affichons␣les␣5␣premieres␣variables␣d’environnement␣\n"); 
11  printf("mais␣nous␣les␣comptons␣toutes.␣\n"); 
12  for(i=0; envp[i] ;i++){ 
13    if(i<5) 
14      printf("Envp[%d]␣:␣%s␣\n",i,envp[i]); 
15  } 
16  printf("Il␣y␣a␣%d␣variables␣d’environnement␣:␣\n",i); 
17  return 0; 
18}

DONNéES éCRITES SUR LE fiCHIER STANDARD DE SORTIE

Nous avons 3 arguments :  
argument 0 == c08e01  
argument 1 == c08e01  
argument 2 == c08e01.c  
Nous affichons les 5 premieres variables d’environnement  
mais nous les comptons toutes.  
Envp[0] : TEXSUP=/mnt/src/SVNREPS/coursc/trunk/  
Envp[1] : ForgeV2=/mnt/src/picoforge/branches/version2/  
Envp[2] : GNOME_KEYRING_PID=4275  
Envp[3] : MAILCHECK=60  
Envp[4] : USER=chris  
Il y a 74 variables d’environnement :


Programme 8.1: Affichage des arguments de main()


1#include <stdio.h> 
2int 
3main (int argc, char argv[],char ∗∗envp) 
4
5  int i; 
6  register char ptc; 
7  printf("Nous␣avons␣%d␣arguments␣:␣\n",argc); 
8  for(i=0;i<argc;i++){ 
9    printf("argument␣%d␣==␣",i); 
10    for(ptc=argv[i];ptc;ptc++) 
11      printf("%c",ptc); 
12    printf("\n"); 
13  } 
14  printf("Nous␣affichons␣les␣5␣premieres␣variables␣d’environnement␣\n"); 
15  printf("mais␣nous␣les␣comptons␣toutes.␣\n"); 
16  for(i=0; envp[i] ;i++){ 
17    if(i<5){ 
18      printf("Environnement␣%d␣==␣",i); 
19      for(ptc=envp[i];ptc;ptc++) 
20        printf("%c",ptc); 
21      printf("\n"); 
22    } 
23  } 
24  printf("Il␣y␣a␣%d␣variables␣d’environnement␣:␣\n",i); 
25  return 0; 
26}

DONNéES éCRITES SUR LE fiCHIER STANDARD DE SORTIE

Nous avons 3 arguments :  
argument 0 == c08e02  
argument 1 == c08e02  
argument 2 == c08e02.c  
Nous affichons les 5 premieres variables d’environnement  
mais nous les comptons toutes.  
Environnement 0 == TEXSUP=/mnt/src/SVNREPS/coursc/trunk/  
Environnement 1 == ForgeV2=/mnt/src/picoforge/branches/version2/  
Environnement 2 == GNOME_KEYRING_PID=4275  
Environnement 3 == MAILCHECK=60  
Environnement 4 == USER=chris  
Il y a 74 variables d’environnement :


Programme 8.2: Arguments de main() caractères un-à-un


 suivant   précédent   fin précédent   haut   superieur 

C. Bac, IMT/TSP, 2013