Systèmes et Réseaux (SR1) - MIAGE 2
Systèmes d'exploitation

 

TP n°3 : Fichiers

 

Objectifs : Communication à travers les fichiers et les tubes

  1. Rappels

  2. Manipulation de tubes

  3. Tubes et FIFOs

  4. Verrouillage de fichiers

1    Rappels

2    Manipulation de tubes

Pour permettre la communication entre un processus père et son fils, il est possible d'utiliser un tube créé par la primitive pipe. Cette primitive prend en argument un tableau de deux entiers, qui contiendra les descripteurs de fichiers correspondant à l'entrée et à la sortie du tube. Si la création échoue, la primitive renvoie -1 ; sinon le tube est créé en mémoire, l'élément 1 du tableau contient le descripteur de l'entrée et l'élément 0 le descripteur de la sortie. On peut alors écrire et lire dans le tube au moyen des primitives write et read et chaque processus peut fermer sa partie inutilisée du tube à l'aide de close.

  1. Ecrire un programme qui crée un tube, puis un fils (rappelons que le fils hérite des descripteurs du père). Le père devra fermer la sortie du tube, puis écrire tout ce qu'il lit au clavier (descripteur 0) dans le tube. Le fils devra fermer l'entrée du tube, puis écrire tout ce qu'il lit dans le tube vers l'écran (descripteur 1).

  2. Même question mais cette fois, le père crée un tube, puis deux fils. Le fils 1 envoie dans le tube ce qu'il lit au clavier, le fils 2 affiche à l'écran ce qu'il lit dans le tube. Proposer une méthode pour terminer proprement le déroulement de ces opérations.

  3. La primitive dup sert à dupliquer un descripteur de fichier en utilisant le plus petit numéro de descripteur non utilisé. Elle prend en argument un descripteur de fichier ouvert et retourne le descripteur de la copie. Pour rediriger la sortie standard à l'écran (respectivement l'entrée standard au clavier), l'idée est de fermer le descripteur 1 (respectivement 0), puis de faire dup sur le descripteur qui deviendra la nouvelle sortie standard (respectivement la nouvelle entrée standard). Dans les deux cas, il ne faudra pas oublier de fermer également le descripteur original (celui qu'on vient de dupliquer), puisqu'il ne sert alors plus à rien.
    Refaire la question 1 ci-dessus en redirigeant la sortie standard du père vers l'entrée du tube et l'entrée standard du fils vers la sortie du tube. Lancer ensuite dans chacun des processus la commande cat au moyen de execv.

3    Tubes et FIFOs

  1. Examiner les programmes mainpipe.c, client.c et server.c. Les faire fonctionner ; que font-ils ?

  2. Modifier le programme mainpipe.c pour faire communiquer un client et un serveur par FIFO, le serveur étant toujours fils du client.
    A-t-on besoin de modifier les programmes client.c et server.c ?

  3. Modifier les programmes ci-dessus pour construire un client et un serveur indépendants communiquant par FIFO, en supprimant le programme principal.

  4. Ecrire des programmes client et serveur remplissant des fonctions de lecture d'un fichier.

4    Verrouillage de fichiers

  1. Ecrire un programme qui verrouille, en mode exclusif, deux fichiers supposés préalablement créés, dont les noms sont passés en paramètres. Soit testlock le programme exécutable. Exécutez testlock fich1 fich2 & testlock fich2 fich1 & et vois si on peut créer une situation d'interblocage. Faire afficher des messages aux processus lors des opérations de verrouillage, pour suivre leur déroulement.
    N. B. La primitive lockf détecte un interblocage potentiel. Voir man lockf.