Première partie du tutorat C/Unix : Mini-shell

Nathalie Devesa & Xavier Redon

1   Introduction

Un shell est un interpréteur de commandes qui boucle indéfiniment sur :

2   But de l'exercice

On se propose d'écrire un mini-shell répondant au cahier des charges suivant :

3   Indications

Le code permettant d'isoler et récupérer une commande simple dans la ligne de commande est fourni ci-dessous :

/********************** Constantes ***************************/

#define MAX_CHAINE 1024
#define MAX_ARGS 16
#define PONCTUATIONS ";|&\n"
#define ESPACES  " \t"

/******************* Structures ******************************/

typedef char commande[MAX_ARGS][MAX_CHAINE];
 /* Soit c de type commande ; c est un tableau de chaîne */
 /* tq c[i] = (i+1)ème composante de la commande         */

/************** fonction lireCommande ************************/
/* lit une commande simple et range ses composantes dans c ; */
/* retourne le nombre de composantes de la commande lue      */

int lireCommande(commande c){
 char tampon[MAX_CHAINE];
 char format[MAX_CHAINE];
 char formatEspaces[MAX_CHAINE];
 int index=0;

 /* construction du format "%[^;|&\n \t]s" */
 sprintf(format,"%%[^%s%s]s",PONCTUATIONS,ESPACES);

 /* construction du format "%[ \t]s" */
 sprintf(formatEspaces,"%%[%s]s",ESPACES);

 /* passer les espaces éventuels en début de commande : */
 /* les espaces et tabulations sont rangés dans tampon  */
 /* la lecture s'arrête sur tout autre caractère.       */
 fscanf(stdin,formatEspaces,tampon);

 /* lecture d'une commande simple */
 while(fscanf(stdin,format,tampon)==1){
  /* une composante de la commande est lue                     */
  /* la composante est rangée dans tampon                      */
  /* la lecture s'est arrétée sur une ponctuation ou un espace */
   if(index<MAX_ARGS) strcpy(c[index++],tampon);

  /* passer les espaces éventuels entre deux composantes */
    fscanf(stdin,formatEspaces,tampon);
   }

/* le prochain caractère à lire est une ponctuation    */
/* On retourne le nombre de composantes de la commande */
return index;
}



This document was translated from LATEX by HEVEA and HACHA.