Table des matières


Consignes :

Cette séance de 2h30 est notée et à réaliser individuellement. L’utilisation d’Internet est autorisé mais il est formellement interdit de communiquer avec les autres étudiants.

Vous devez téléverser sur moodle vos fichiers à la fin des étapes 5, 10 et 13. Aucun dépôt ne sera possible après l’heure limite mais vous pouvez modifier vos fichiers autant de fois que nécessaire jusqu’à la date limite. Vous pouvez inclure au tout début de vos fichiers un commentaire pour indiquer les problèmes connus.

Objectifs :

L’objectif de cet exercice est de simuler une partie de roulette russe entre plusieurs joueurs. Les joueurs d’une roulette russe se passent tour à tour un revolver ne possédant qu’une seule balle dans son barillet (un barillet possède au maximum 8 balles). Le joueur possédant le revolver appuie sur la gâchette en pointant le revolver sur sa tempe. S’il survit, il passe le revolver à son voisin. La ronde s’arrête quand un joueur meurt. On prend alors un nouveau revolver que l’on donne à un joueur au hasard et ainsi de suite jusqu’à ce qu’un seul joueur reste en vie.

Passer l’arme à gauche


Étape 1 :
Créez un processus arbitre (arbitre.sh) qui, pour X données en paramètres, crée X joueurs (joueur.sh) en arrière plan. Les joueurs doivent dire toutes les 6 secondes “I am stressed” et connaître le PID de l’arbitre. Utilisez les commandes sleep et wait pour faire cela.

Étape 2 :
Modifiez votre code pour que l’arbitre enregistre le PID des processus qu’il crée dans un fichier listePID.txt. Créez une variable posListe (initialisée à 1) qui indiquera quel joueur est en train de passer.

Étape 3 :
L’arbitre initialise un fichier revolver.txt qui a la valeur 8 sur sa première ligne. Modifiez votre code en conséquence.

Étape 4 :
L’arbitre envoie un signal SIGUSR2 au premier joueur. Quand un joueur reçoit ce signal, il envoie en retour un signal SIGUSR2 à l’arbitre. Modifiez votre code en conséquence.

Étape 5 :
Quand l’arbitre reçoit un signal SIGUSR2, il envoie un signal SIGUSR2 au prochain joueur de la liste. Pour ce faire, on utilise la variable posListe et la commande sed -n ’Xp’ < cheminFichier permettant de lire la Xème ligne du fichier cheminFichier. Quand le dernier joueur est passé, on passe à nouveau la main au premier joueur. Modifiez votre code en conséquence.

Balles à blanc


Pour le moment, les joueurs vont se tirer dessus sans risque de mourir puis passer l’arme à leur voisin.

Etape 6 :
Lorsqu’un joueur reçoit un signal SIGUSR2, la valeur de revolver.txt est décrémentée avant d’envoyer le signal SIGUSR2 à l’arbitre. Le joueur affiche en plus le nombre de balles restantes dans le terminal.

Etape 7 :
Créez un script mort.sh qui détermine si un joueur est touché ou non. Ce script renvoie la valeur 0 si l’individu est touché et 1 autrement. Pour ce faire, tirez un nombre aléatoire compris entre 1 et le nombre de balles restantes (voir fichier revolver.txt). Nous supposerons que le joueur est touché si la valeur tirée vaut 1.

Etape 8 :
Lors de la réception d’un signal SIGUSR2, le joueur doit désormais se tirer dessus. Pour ce faire on exécute le script mort.sh avant la décrémentation de la valeur de revolver.txt. Ainsi, le premier joueur a une probabilité de 1/8 de se tirer dessus, le second 1/7, etc.

Etape 9 :
Quand le coup touche (donc quand la valeur de retour de mort.sh vaut 0), on remet la valeur de revolver.txt à 8 et on envoie un signal SIGUSR1 à l’arbitre au lien d’un signal SIGUSR2 pour lui signaler que le joueur s’est blessé. Modifiez le code en conséquence.

Etape 10 :
L’arbitre annonce le PID du joueur touché lorsqu’il reçoit le signal SIGUSR1.

Un tir, un mort


Etape 11 :
Faites en sorte que la boucle continue lorsque l’arbitre reçoit un signal SIGUSR1.

Etape 12 :
Lorsque l’arbitre reçoit un signal SIGUSR1, il doit rayer la liste de la personne touchée du fichier listePID.txt. Assurez-vous que la boucle continue normalement (il faut mettre à jour le modulo).

Etape 13 :
Modifiez le joueur afin qu’il se suicide après avoir été touché (et avoir envoyé son signal SIGUSR1).