CSC3102 – Contrôle Final 1 – Année 2019/2020
- Répondez aux questions en écrivant directement dans les cadres fournis au fil du sujet ou dans les listings des scripts placés en fin d'exercice. Si vous deviez manquer de place, vous pouvez également écrire en fin de sujet en l'indiquant dans l'encart initial.
- Sont autorisés le polycopié, l'annexe et les travaux pratiques du module, ainsi que vos notes personnelles manuscrites.
- Les trois exercices sont indépendants.
- La durée est fixée à 2h.
- Le barème est donné à titre indicatif.
Le tri de fichiers par taille (6 points)
Le but de cet exercice est d'extraire un ensemble de fichiers selon un motif, de récupérer leur taille dans un fichier et de trier ce fichier selon l'ordre croissant des tailles. Soit un répertoire contenant un ensemble de fichiers (pas de répertoires).
Interlude publicitaie (8 points)
Afin de financer la diffusion en boucle du Boléro de Ravel, un processus cantateur bolero fait appel à un service publicitaire. Ce dernier est chargé de fournir au cantateur des réclames de longueurs variées à une fréquence aléatoire.
Le script bolero.sh est démarré en tâche de fond avant le script publicitaire.sh, qui prend en paramètre le PID du processus cantateur. L'illustration suivante propose un scénario d'exécution conforme au comportement attendu une fois l'exercice achevé :
$ ./bolero.sh &
Bolero [PID=1298]
Quem tem a viola
Pra se acompanhar
Nao vive sozinho
Nem pode penar
Tem som de rio
....
*******[PUB]**********
Le shell, c'est la vie !
**********************
.....
|
$ ./publicitaire.sh 1298 |
Présicion : Dans cet exercice, il n'y a pas de concurrence : on considère qu'il n'y a qu'un seul processus bolero et qu'un seul processus publicitaire.
Consignes : Les squelettes des différents scripts sont donnés en fin d'exercice. Ils doivent être complétés au fur et à mesure que vous répondez aux questions de cet exercice. Merci d'annoter chaque ligne ajoutée avec le numéro de la question à laquelle vous répondez. De plus, l'espace mis à disposition n'invite pas forcément à remplissage.
À chaque fois que le publicitaire le notifie, le cantateur bolero doit stopper la diffusion de son opéra, diffuser la publicité qui lui est transmise via le canal de communication ouvert à la question précédente puis reprendre la diffusion du Boléro où il l'avait laissée.
- Mettez en place la notification du processus bolero par le publicitaire en lui envoyant un signal de type USR1.
- Mettez en place la récupération de la notification émise à la question précédente dans le script bolero.sh. Elle doit avoir pour effet le lancement du script lecture_pub.sh. Ce dernier a pour objectif de récupérer et d'afficher la publicité transmise et sera l'objet de la question suivante.
Une réclame est composée de plusieurs lignes qui doivent être lues et affichées les unes après les autres par lecture_pub.sh, sur demande du processus bolero.
- Afin de pouvoir identifier la fin de la réclame, finalisez la transmission de la réclame faite dans le script publicitaire.sh avec l'écriture de la ligne "FIN DE LA PUB".
- Complétez le script lecture_pub.sh qui est en charge de lire ligne-à-ligne sur le canal de communication dédié. Le script affiche au fur et à mesure ce qu'il lit tant que la ligne "FIN DE LA PUB" n'est pas lue.
Le problème des trains de Whittier (6 points)
Whittier est une ville d'Alaska traversée par une voie de chemin de fer. Cette voie passe dans un tunnel traversant la montagne. Cependant, les trains traversant la montagne dans les deux sens partagent la même voie. En d'autres termes, une unique voie est utilisée dans les deux sens.
Afin d'éviter les soucis de collision, un feu de signalisation est installé de chaque côté de tunnel.
Les codes exécutés par les trains allant de l'est à l'ouest (trainEO.sh), allant de l'ouest à l'est (trainOE.sh), pour gérer les feux de signalisation (feu.sh) ainsi que les explications des différents scripts sont fournis ci-dessous.
Afin que les trains puissent voir la couleur du feu, celle-ci est écrite dans un fichier pour chaque sens. Ainsi, lorsque le feu Est-Ouest est vert, feu.sh écrit la valeur 1 dans le fichier feuEO et la valeur 0 dans feuOE (indiquant que le feu Ouest-Est est rouge). À chaque itération, le processus exécutant feu.sh fait passer le feu rouge à vert (de la valeur 0 à la valeur 1) et le feu vert à rouge (de 1 à 0).
Du côté des trains, un train voulant passer de l'Est à l'Ouest lit la valeur contenue dans le fichier feuEO. Tant que cette valeur n'est pas égale à 1 (donc n'est pas passée au vert), le processus continue de lire la valeur. Une fois la valeur à 1, le train passe en affichant "le train Est-Ouest passe". Un train voulant faire le trajet Ouest-Est exécute un code similaire avec le fichier feuOE. On considère qu'un train est passé lorsque le script correspondant affiche le message et se termine.
Soit le script regulation.sh suivant:
Ce script initialise les feux (le feux Est-Ouest est vert et le feu Ouest-Est est rouge), puis démarre les différents scripts en arrière plan.