TD 14: Mini Shell avec job control

Tristan Crolard - François Pottier

Rappelons que les sujets et corrigés de chaque TD sont accessibles sur les machines des élèves, dans ~pottier/TD-Systems-98-99/. Essayez les programmes, modifiez-les, exécutez-les pas-à-pas, etc. pour mieux comprendre leur fonctionnement.

Introduction

On se propose d'implanter un mini shell avec ``job control''. On veut pouvoir :

Pour simplifier un job sera associé à un seul processus.

Exemple d'utilisation

mysh>ls
Makefile  mysh      mysh.c    mysh.o    parse.c   parse.h   parse.o
mysh>xclock &
[0] (8083) xclock &
mysh>xterm &
[1] (8084) xterm &
mysh>jobs
[0] (8083) xclock &
[1] (8084) xterm &
mysh>fg
[1] (8084) Done: xterm &
mysh>jobs
[0] (8083) xclock &

Implantation

Type abstrait ``vecteur de jobs''

On implante un job par le type concret suivant :

typedef int job_num;
typedef struct {
  char *commande;
  pid_t pid;
  job_num num;
} job;

Implanter le type abstrait ``vecteur de jobs'' dont les primitives sont les suivantes (vous pouver utiliser des tableaux de taille fixe ou variable, ou des listes...):

void     creer_jobs (void);
job_num  cherche_job (pid_t pid);
job_num  nouveau_job (char *commande, pid_t pid);
void     libere_job (job_num j);
pid_t    job_pid (job_num j);
char    *job_commande (job_num j);
bool     libre (job_num j);
job_num  dernier_job (void);

Fonctions mineures

Fonctions principales

La fonction main

La fonction main prend en charge la boucle principale :

int main(int argc, char *argv[]) 
{  
  char s[MAX_LEN];

  creer_jobs();
  while (1) {
    mise_a_jour();
    invite();
    if (lire_commande(s))
      traite_commande(s);
    else
      fprintf(stderr, "Ligne incorrecte\n");
  };
  return EXIT_SUCCESS;
}


Jean-Baptiste Yunes
1999-03-08