TP Fichiers
B. Dupouy et S. Gadret
| 1ère partie |
Rendre les exercices : I.2, I.3 et I.4
|
| 2ème partie | Rendre l'exercice : II.4. |
Envoyer les exercices par mail à l'enseignant
qui vous fait les cours.
Le texte du sujet ( subject ) doit contenir
le nom de l'UE et celui du groupe (par exemple : INF104-G3).
mail -s"G3" leprof < exo.c
On rappelle que tous les fichiers ouverts par un processus sont vus par l'ensemble de ses descendants. Unix n'impose aucune contrainte d'accès, toutes les synchronisations sont à la charge de l'utilisateur. L'exemple suivant illustre l'accès simultané, par deux processus, à un même fichier en lecture puis à un même fichier en écriture.
Exemple :
Le programme
exo1.c
fait faire
la copie d'un fichier (fichier source ) dans un autre
(fichier destination) par deux processus. Les noms des deux
fichiers, source et destination, sont passés sur la ligne de commande
(utilisation de argc, argv).
On testera ce programme avec le fichier
sema.txt,
(exo1 est le nom de l'exécutable correspondant à exo1.c)
en faisant :
diff sema.txt sortie.txt
ou
diff exo1.c sortie.txt
Question :
Comment pourrait-on résoudre ce problème ?
Après l'avoir lu et recopié, compiler le programme suivant.
Fonctionnement du programme :
Ce programme écrit les caractères saisis au clavier
sur un fichier de sortie dont on a donné le nom sur la ligne
de commande.
Utilisation du programme :
On lancera le programme dans deux fenêtres différentes
en lui passant à chaque fois le nom d'une même troisième
fenêtre sur la ligne de commande.
On rappelle que la commande tty renvoie le nom de la
fenêtre
dans laquelle cette commande tty a été lancée.
Exemple de lancement du programme
Pour obtenir les sorties sur la fenêtre dont le nom est
/dev/pts/3, on utilisera le programme de la façon suivante
(a.out
est le nom que gcc donné par
défaut à un exécutable)
:
a.out /dev/pts/3
Aller maintenant chercher un
autre
fichier.
Le canevas contenu dans ce fichier propose une version
améliorée du programme précédent.
Fonctionnement de cette nouvelle version :
Dans cet exercice on va ouvrir deux fichiers et poser des verrous S1 et S2 sur ces fichiers de façon à se trouver dans une situation d'interblocage telle que :
| Processus 1 | Processus 2 |
|
P(S1)
P(S2) section critique V(S2) V(S1) |
P(S2)
P(S1) section critique V(S1) V(S2) |
A faire :
Récupérer le programme se trouvant dans le fichier lockf_dead1V0.c.
|
Exécution sur fenêtre 1 : lock_dead /dev/pts/6 /dev/pts/8/ |
Exécution sur fenêtre 2 : lock_dead /dev/pts/8 /dev/pts/6/ |
Pid 3652 : entree dans SC1 (/dev/pts/4), Ret_lockf=0 Pid 3652 : entree dans SC (/dev/pts/1), Ret_lockf=0, Entrees =1 Pid 3652 : sortie de SC2 (/dev/pts/1), Ret_lockf=0 Pid 3652 : sortie de SC1 (/dev/pts/4), Ret_lockf=0 Pid 3652 : entree dans SC1 (/dev/pts/4), Ret_lockf=0 lockf Fichier_2: Deadlock situation detected/avoided Pid 3652 : ulock /dev/pts/4 (Deadlocking=0) Pid 3652 : entree dans SC1 (/dev/pts/4), Ret_lockf=0 lockf Fichier_2: Deadlock situation detected/avoided Pid 3652 : ulock /dev/pts/4 (Deadlocking=1) Pid 3652 : entree dans SC1 (/dev/pts/4), Ret_lockf=0 Pid 3652 : entree dans SC (/dev/pts/1), Ret_lockf=0, Entrees =2
Les pipes, en français tubes, sont l'implantation Unix des tampons gérés suivant le schéma producteur/consommateur. On en représente le principe de fonctionnement avec des sémaphores :
Producteur
...
P(S1)
écrire (case(i))
i = suiv_prod(i)
V(S2)
...
|
Consommateur
...
P(S2)
lire (case(i))
i = suiv_cond (i)
V(S1)
...
|
S1 et S2 sont initialisés ainsi : Init (S1,N) et Init (S2, 0). Le tampon est visualisé ci-dessous :
|
Nous donnons ici quelques exemples très simples.
| Compter le nombre d'utilisateurs sur un site | who | wc -l |
| Compter le nombre de processus sur un site | ps -axl | wc -l |
| Retrouver les commandes lancées par dupont | ps -axl | grep dupont |
| Retrouver tous les login contenant la chaîne "dup" dans /etc/password | ypcat passwd | grep dup |
Pour gérer et utiliser un tube :
| Dans le programme pipe-plus.c., le père et le fils communiquent via un tube (pipe). Le père attend des caractères depuis le clavier et les écrit dans le tube. Le fils (le consommateur) se contente d'afficher ce qu'il a lu dans le tube |
|
Remarque :
On sort de la boucle de lecture lorsque tous les producteurs (ceux qui font
write) ont fait close, sinon on continue à boucler
sur read.
On constatera que le tube n'est pas immédiatement
fermé lorsqu'il reçoit EOF, qui est représenté par
<CTRL D>.
D'après l'exemple donné ci-dessus et les TP signaux et processus, écrire un programme dont le fonctionnement est le suivant :
|
Le canevas du programme à écrire est là.
©(Copyright) dupouy@inf.enst.fr