CSC 3102 – Introduction aux systèmes d’exploitation

Portail informatique

CSC3102 – Contrôle Final 2 – Année 2018/2019

Durée: 2h, tout document papier autorisé

Le barème est donné à titre indicatif

On suppose que vous disposez des scripts P.sh et V.sh permettant d'acquérir ou de libérer un verrou.

Welcome to Zombieland (15 points)

Le but de cet exercice est de simuler un univers dans lequel de gentils zombies se font attaquer par de terribles humains.
Mise en place (3,5 points)

1 point

Écrivez un script nommé game.sh dans lequel vous quitterez en affichant un message d'erreur adéquat si :
  • le script ne reçoit pas exactement un argument,
  • cet argument est différent de "zombie" et de "humain".

2 points

Les personnages (que ce soient des zombies ou des humains) vont communiquer en utilisant des fichiers qui se trouvent dans le répertoire /tmp/univers. Ce répertoire doit donc exister avant qu'un personnage ne puisse jouer. Donnez le code permettant de créer ce répertoire s'il n'existe pas déjà.
Pensez que plusieurs personnages peuvent essayer de créer le répertoire en même temps.

0,5 points

Modifiez votre script de façon à ce que chaque personnage (que ce soit un zombie ou un humain) crée un tube nommé /tmp/univers/PIDPID est le PID du processus.
Choix d'une victime (5,5 points)
Lorsqu'il démarre, un personnage peut choisir une victime. Choisir une victime revient à choisir aléatoirement l'un des tubes se trouvant dans le répertoire /tmp/univers. Pour cela, vous devez donner le code permettant de réaliser les étapes suivantes :
Il est déconseillé d'utiliser des commandes complexes comme cut ou tr pour répondre aux questions de cette partie. À la place, il est plutôt conseillé d'utiliser des motifs bash, de faire des boucles et d'effectuer les calculs à l'aide de la commande expr.

1 point

Pour commencer, vous devez stocker les fichiers se trouvant dans le répertoire /tmp/univers dans une variable nommée persos. Pour cela, commencez par vous déplacer dans le répertoir /tmp/univers, puis stockez l'ensemble des fichiers se trouvant dans le répertoire courant dans la variable persos.

1,5 point

Ensuite, vous devez compter le nombre de mots dans persos de façon à connaître le nombre de personnages participant au jeu. Vous stockerez ce nombre dans la variable nommée n. Pour cela, nous vous conseillons d'itérer sur les mots constituant persos.

1 point

Après, vous devez tirer un nombre aléatoire compris entre 0 et n-1 que vous stockerez dans une variable k. Pour tirer un nombre aléatoire, il vous suffit d'utiliser la variable $RANDOM qui vous donne un nombre compris entre 0 et 32767. Pour ramener ce nombre à une valeur comprise entre 0 et n-1, vous pouvez utiliser un modulo (% avec la commande expr).

2 points

Enfin, vous devez sélectionner le kième mot de persos et stocker ce mot dans la variable victime. De la même façon, nous vous conseillons d'itérer sur les mots constituant persos.
À l'attaque ! (6 points)
Après avoir choisi une victime, un personnage l'attaque.

2 points

Un humain attaque sa victime en lui envoyant un signal SIGUSR1 alors qu'un zombie attaque un humain en lui envoyant le message bouh ! via le tube de la victime. Donnez le code permettant à un personnage d'attaquer sa victime.
Comme vous avez du le voir, il est tout à fait possible qu'un personnage attaque un personnage du même type. Nous traiterons ce cas dans une prochaine question.

1,5 points

Lorsqu'il reçoit un signal SIGUSR1, un personnage s'est donc fait attaqué par un humain. Si le personnage est humain, il n'affiche rien, mais si le personnage est zombie, il affiche "pourquoi tant de haines ?". Donnez le code permettant de traiter la réception d'un signal SIGUSR1.

2,5 point

Pour pouvoir traiter le cas où l'attaque provient d'un zombie, un personnage doit exécuter une boucle infinie dans laquelle il attend des messages sur son tube. À la réception d'un message, si le personnage est un zombie, il n'affiche rien, en revanche, si le personnage est un humain, il affiche "même pas mal". Donnez le code de cette boucle infinie.
Si vous voulez tester votre game.sh, vous pouvez utiliser le script de test suivant 

Fichier de taille minimale (5 points)

Le but de cet exercice est de trouver le fichier de taille minimale dans un répertoire. Pour cela nous supposons que dans votre répertoire courant, il y a plusieurs fichiers et répertoires contenant potentiellement eux-mêmes des fichiers.

1 point

Commencez par vérifier qu'il y a exactement un paramètre passé au script.

1 point

Dans le répertoire courant, cherchez tous les fichiers dont le nom contient la chaîne de caractères "csc".

2 points

Parmi ces fichiers, identifiez le fichier de taille minimale. Nous supposons que la taille maximale possible est fournie en paramètre du script (celui dont vous avez vérifié l'existence à la question a). Servez-vous de cette valeur pour initialiser la taille mininum.

1 point

Afficher le chemin du fichier de taille minimale ainsi que son contenu.