Systèmes et Réseaux (SR1)
- MIAGE 2
Systèmes d'exploitation
TP n°3 : Fichiers
Commande de compilation d'un programme C : gcc -o prog prog1.c prog2.c ... progn.c
Librairie à utiliser (inclure csapp.h aux programmes du TP) : csapp.h et csapp.c
Pour utiliser csapp, ajouter les options suivantes dans la commande de compilation : -l socket -lnsl -lrt
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.
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).
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.
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.
Examiner les programmes mainpipe.c, client.c et server.c. Les faire fonctionner ; que font-ils ?
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 ?
Modifier les programmes ci-dessus pour construire un client et un serveur indépendants communiquant par FIFO, en supprimant le programme principal.
Ecrire des programmes client et serveur remplissant des fonctions de lecture d'un fichier.
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.