Systèmes d’Exploitation – Mini-Projet 1

Mise en place

Le but de ce mini-projet est de programmer un shell simple.

Ce mini-projet est à faire sous environnement UNIX en C. L’utilisation de l’appel system() de la stdlib est proscrit, car cet appel utilise le shell sh pour exécuter des commandes.

Votre shell devra utiliser des appels systèmes tel que open() ou fork(). Pour obtenir la documentation sur les appels, vous pouvez utiliser la commande:

   $ man 2 <commande>

Le 2 fait référence à la section 2 du manuel qui catalogue les fonctions système.

Utilisation de Git

Pour tous les Mini-Projets (MPs) de système on utilisera git. Vous avez vu son utilisation et configuré un dépôt dans le TP1.

Allez dans votre dépôt git et créez un nouvel répertoire pour travailler sur le MP1:

    $ cd prenom-nom/
    # Créez maintenant un répertoire MP1
    $ mkdir MP1/
    $ cd MP1/

Faites maintenant le MP normalement. Vous travaillerez sur le répertoire MP1 que vous venez de créer. À chaque question vous committerez vos modifications.

Pour envoyer votre travail sur le serveur de rendu (en fin de séance), vous utiliserez la commande:

    $ git push origin master

Makefile et nom du binaire

Pour compiler votre shell, le script de correction automatique utilisera les commandes suivantes:

   $ cd MP1/
   $ make

Pour executer votre shell, le script de correction automatique utilisera la commande suivante:

   $ cd MP1/
   $ ./mishell

Assurez vous donc de commiter un Makefile qui fabrique un binaire appellé mishell (comme mini shell).

Notation

Ce MP sera noté. La date de rendu est disponible sur le calendrier des cours. Le rendu se fera en pushant sur votre dépôt SEA.

Trois critères seront utilisés pour la notation:

Un shell simple

Le shell est un programme qui permet à l’utilisateur de lancer des programmes de manière interactive. Des exemples de shell courants sont bash, ksh, tcsh, fish, zsh.

Commitez sous git à la fin de chaque question.

  1. Programmez l’interface textuelle de votre shell. Votre shell doit présenter un invite à l’utilisateur (obligatoirement terminé par %) puis lire l’entrée de l’utilisateur. Pour l’instant, contentez vous d’imprimer le texte que l’utilisateur à entré. Vous pouvez utiliser les fonctions: printf et fgets par exemple. Lorsque l’utilisateur tape CTRL+D (soit EOF) en début d’invite le programme doit quitter.

    Exemple d’execution:

        % cd
        cd
        % ls
        ls
        %
  1. Programmez un parseur simple qui décompose l’entrée de l’utilisateur en tokens. Les tokens sont les mots de l’entrée qui sont séparés par des espaces ou des tabulations. Par exemple, l’entrée ls ../.. | sort est composée des 4 tokens suivants: ls, ../.., |, et sort.

    À ce stade-ci votre shell doit juste imprimer la liste des tokens à chaque entrée. Vous pouvez utiliser la fonction strsep pour cela.

    Exemple d’execution:

        % ls ..
        ls
        ..
        % cd
        cd
        %
  1. Implémentez deux primitives du shell:

    Vous pouvez utiliser les fonctions strcmp, getcwd et chdir.

    Exemple d’utilisation:

        /home/toto % cd ..
        /home/ % exit
  1. Implémentez l’exécution de commandes simples. Sauf si cd ou exit sont reconnus, le shell suppose que l’utilisateur à tapé une commande à exécuter. Implémentez l’execution de commandes sans vous servir de la fonction system. Vous pouvez utiliser fork, execvp et waitpid.

    Exemple d’utilisation:

        /home/toto % ls -a
        . .. documents
        /home/toto % cat /etc/passwd
        root:x:0:0:root:/root:/bin/bash
        daemon:x:1:1:daemon:/usr/sbin:/bin/sh
        bin:x:2:2:bin:/bin:/bin/sh
        sys:x:3:3:sys:/dev:/bin/sh
        ...

Fonctionnalités avancées

  1. Implémentez la redirection d’entrées sorties standard. Votre shell doit reconnaître les redirections suivantes: >, < et 2>.

    Vous pouvez utiliser les fonctions dup2, open et close.

    Exemple d’utilisation:

        /home/toto % ls -a > out
        /home/toto % cat out
        .
        ..
        documents
        out
        /home/toto % sort -r < out
        out
        documents
        ..
        .
  1. Implémentez les pipes. Vous pouvez utiliser la fonction pipe. Votre code ne doit pas faire l’hypothèse d’un nombre de pipes maximal.

    Exemple d’utilisation:

        /home/toto % ls -a | sort -r | grep o
        out
        documents
        /home/toto % sort -r < out | grep o > out2
        /home/toto % cat out2
        out
        documents
  1. Implémentez la mise en tâche de fond, opérateur &.

    Exemple d’utilisation:

        /home/toto % sleep 5 &
        /home/toto % echo hi
        hi
  1. SECRET LEVEL: Implémentez une/des fonctionnalité(s) de votre choix (attention pour débloquer ce niveau il faut avoir répondu à toutes les autres questions avant). Quelques suggestions: complétion automatique avec TAB, job control (bg et fg), gestion des variables d’environnement, amélioration du parseur pour prendre en compte les guillemets, sous-shells $().
Secret Level
Secret Level