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.
On se propose d'implanter un mini shell avec ``job control''. On veut pouvoir :
mysh>commande
mysh>commande &
mysh>jobs
Pour simplifier un job sera associé à un seul processus.
mysh>xclock & [0] (8083) xclock & mysh>xterm & [1] (8084) xterm & mysh>jobs [0] (8083) xclock & [1] (8084) xterm & mysh>ls Makefile mysh mysh.c mysh.o parse.c parse.h parse.o mysh>jobs [0] (8083) xclock & [1] (8084) xterm & mysh> [1] (8084) Done: xterm & mysh>jobs [0] (8083) xclock &
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);
void invite(void);
bool lire_commande(char *s)
void liste(void);
void mise_a_jour(void);
void invite(void);
void traite_commande(char *s);
void liste(void);
Mise a jour de la liste des jobs
void mise_a_jour(void);
Affichage de l'invite
void invite(void);
Traitement d'une commande
void traite_commande(char *s);
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; }