CSC 3102 – Introduction aux systèmes d’exploitation

Portail informatique

Contrôle Final 1 – Année 2015/2016

Le barème est donné à titre indicatif

Pour faire les exercices, vous avez besoin de connaître le langage bash. Vous pouvez vous référer à l'annexe shell que vous pouvez trouver ici.

Pour faire le contrôle, vous aurez aussi besoin des scripts et .

On vous rappelle que vous devez exécuter vos scripts pour les tester. Si les scripts ne peuvent pas s'exécuter, vous perdrez des points.

Préparation (2 points, ∼5mn)

Créez un répertoire Nom_Prenom, où Nom est votre nom et Prenom votre prénom. Dans ce répertoire, vous devez créer des sous répertoires nommés exo2 et exo3 dans lesquels vous mettrez les scripts des différents exercices.

À la fin du contrôle, vous devez rendre une archive contenant exactement cette arborescence. On vous rappelle que vous pouvez créer une archive de la façon suivante :
$ tar -f Nom_Prenom.tgz -cz Nom_Prenom

Explorateur de fichier (7 points, ∼25mn)

(5 points)

On souhaite écrire un script lsfic.sh qui prend un fichier en argument. Un appel possible est : ./lsfic.sh fic. Le but de ce script est d'écrire, dans le fichier fic le nom de chacun des éléments du répertoire courant, 1 élément par ligne, en faisant précéder le nom par «dir: » s'il s'agit d'un répertoire et «fic: » s'il s'agit d'un fichier. Si le paramètre fic n'est pas donné, le script doit se terminer en affichant un message d'erreur.

Une exécution possible est :
$ ./lsfic.sh Please, give the name of a file $ ./lsfic.sh fic $ cat fic fic: exo-lsfic.php fic: lsfic.sh dir: rigolo

(1 point)

Ajouter en commentaire à la fin du fichier lsfic.sh la commande permettant de rendre le script lsfic.sh exécutable uniquement pour l'utilisateur. On vous rappelle qu'un commentaire en shell est indiqué par le caractère « # ».

(1 point)

On souhaite maintenant que, lorsque l'utilisateur écrit lsfic.sh fic à partir de n'importe quel répertoire, le script soit lancé. Ajouter en commentaire à la fin du fichier lsfic.sh la commande permettant d'y parvenir.

Compteur (11 points, ∼45mn)

(3 points)

On souhaite écrire un premier script nommé incr.sh qui prend un unique paramètre en argument. Un appel possible est :
$ ./incr.sh fic

On suppose que fic est un fichier contenant (uniquement) un nombre entier. Le but de incr.sh est d'incrémenter la valeur se trouvant dans fic, c'est-à-dire de :
  • vérifier que l'argument fic a bien été donné,
  • lire le contenu du fichier fic dans une variable var,
  • afficher var,
  • incrémenter var,
  • écrire la nouvelle valeur de var dans le fichier fic,
  • retourner (avec exit) la valeur de var.

Une exécution possible est, par exemple :
$ ./incr.sh Please, give a file name $ echo 41 > fic $ ./incr.sh fic $ echo $? 42 $ cat fic 42
On vous rappelle que la variable $? contient le code de retour de la dernière commande lancée, c'est-à-dire la valeur indiquée en paramètre du exit dans la sous-commande.

(3 points)

On souhaite maintenant écrire un fichier clock.sh qui prend un unique paramètre en argument. Un appel possible est :
$ ./clock.sh fic

Ce script doit exécuter une boucle infinie qui, dans l'ordre :
  • appel incr.sh avec comme paramètre fic;
  • affiche le PID du processus suivi du code de retour de incr.sh;
  • dort une seconde avec sleep.

Si le fichier fic n'existe pas, le script doit se terminer avec un message d'erreur.

Une exécution possible est, par exemple :
$ echo 0 > fic $ ./clock.sh fic 15640: 1 15640: 2 15640: 3

On vous rappelle qu'une boucle infinie s'écrit de la façon suivante :
while true; do ... done

(3 points)

On souhaite maintenant que l'exécution de ./clock.sh & ./clock.sh ne perde jamais une incrémentation. En particulier, lorsque vous lancez vos scripts, vous ne devez jamais voir le même nombre précédé de deux PID différents. Par exemple, l'exécution suivante est éronnée :
$ echo 0 > fic; ./clock.sh fic & ./clock.sh fic [2] 15679 15679: 1 15680: 2 15679: 3 15680: 3

Alors que celle-ci est correcte :
$ echo 0 > fic; ./clock2.sh fic & ./clock2.sh fic [2] 20460 20461: 1 20460: 2 20461: 3 20460: 4 20461: 5

Copiez votre script clock.sh dans un script nommé clock2.sh et modifiez le script clock2.sh en conséquence.

(2 point)

Lorsque l'utilisateur envoie un signal SIGINT, le script clock2.sh doit maintenant se terminer en affichant Morituri te salutant!.

Copiez votre script clock2.sh dans un script nommé clock3.sh et modifiez le script clock3.sh en conséquence.