Page suivante Page précédente Table des matières

3. Communication avec l'environnement

3.1 Paramètres de 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

    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     }
     
    

    3.2 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
    

    3.3 Variables d'environnement

    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.

    3.4 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.


    Page suivante Page précédente Table des matières