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/PID
où PID 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.
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.