CSC 3102 – Introduction aux systèmes d’exploitation

Portail informatique
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. 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) É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".
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. 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. 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. 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. 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). 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. 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. 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. 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 
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. Commencez par vérifier qu'il y a exactement un paramètre passé au script. Dans le répertoire courant, cherchez tous les fichiers dont le nom contient la chaîne de caractères "csc". 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. Afficher le chemin du fichier de taille minimale ainsi que son contenu.