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 :
-
un affichage de prompt,
- l'analyse d'une ligne de commande,
- éventuellement le lancement de commandes synchrones ou asynchrones.
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.