Files
BUT2FI_2025_R3.05/tp/tp5/README.md

181 lines
6.0 KiB
Markdown
Raw Normal View History

2025-10-01 20:05:36 +02:00
# Redirections, tubes
#### Ex1
Soit le graphe de processus suivant (un tube est établi entre Pf2 et
Pf1f1)
```bash
| P
|____
| \ Pf1
| \
| \
|\Pf2 |\
| \ | \Pf1f1
| \ | \
O O O O
()-->--()
```
1. Ecrivez un programme pipe-ex.c qui implante le graphe ci-dessus
(y compris le tube) et tel que :
- Pf2 écrive en permanence toutes les 3 secondes son PID dans
le tube en affichant ce qu'il écrit
- Pf1f1 lise en permanence chaque seconde depuis tube
`sizeof(pid_t)` en affichant ce qu'il lit
Vérifiez que le programme fonctionne comme prévu, i.e il affiche
:
```bash
16411 sent 16411
16412 received 16411
16411 sent 16411
16412 received 16411
.....
```
2. Lancez le programme ci-dessus et faites les essais suivants
(relancez le programme après chaque essai). Expliquez à chaque
fois vos observations.
1. Envoyez le signal `SIGSTOP` à Pf2, puis le signal SIGCONT à
Pf2.
2. Envoyez le signal `SIGSTOP` à Pf1f1, puis le signal SIGCONT à
Pf1f1.
3. Envoyez le signal `SIGTERM` à Pf2.
4. Envoyez le signal `SIGTERM` à Pf1f1.
3. Modifiez le programme pipe-ex.c en assurant que tous les
processus ferment les descripteurs du tube non utilisés. Faites
les mêmes essais que ci-dessus et expliquez ce que vous
observez.
4. Modifiez encore une fois le programme pipe-ex.c pour que les
deux processus Pf1, Pf2 écrivent dans le tube simultanement et
que seul Pf1f1 le lise. Qu'observez-vous ?
2025-10-03 13:52:45 +02:00
#### Ex11
Le but est de calculer, de façon paralèlle, la somme de tous les entiers jusqu'à une valeur `max`.
- la valeur maximale `max`, et le nombre de processus `n` pour le calcul sont passés à la ligne de commande.
- le processus parent crée `n` processus. Chaque processus compte une trance d'entier différente.
- le processus 0 : 0, n, 2n, 3n , etc.
- le processus 1 : 1, n+1, 2n+1,3n+1
- le dernier procesus `n-1` : n-1, 2n-1, 3n-1, etc.
- Le processus parent attend la fin du calcul de chacun de ses fils, et récupére leur calcul au moyen d'un tube.
Faites afficher le temps de calcul pour différentes valeurs. Est-ce conforme à vos suppositions ? pourquoi ?
2025-10-01 20:05:36 +02:00
#### Ex2
Un groupe d'étudiants en informatique révise son contrôle de scr. Ils ne
peuvent réviser qu'en mangeant de la pizza. Chaque étudiant exécute en boucle :
```c
while(1){
prendre_une_part_de_pizza();
reviser_et_manger_la_part_de_pizza();
}
```
Quand il n'y a plus de pizza, les étudiants dorment. Celui qui prend la dernière
part commande une nouvelle pizza.
Écrire un programme en C qui crée les processus fils étudiants (leur nombre est
passé à la ligne de commande). Les parts de pizza, numérotés de 1 à 8, sont
placées dans un tube par le pére. Les fils connsomment chaque part depuis le
tube. Un autre tube permet à celui qui prend la dernière part d'en commander une
autre.
Exemple de trace d'exécution
```
[denis@portabledenis test]$ ./pizza 10
student 1 takes piece 1
student 8 takes piece 2
student 0 takes piece 3
student 3 takes piece 4
student 9 takes piece 5
student 2 takes piece 6
student 4 takes piece 7
student 5 takes piece 8
student 5 orders a pizza
pizza ordered!
pizza delivered!
student 6 takes piece 1
student 7 takes piece 2
student 9 takes piece 3
student 0 takes piece 4
student 5 takes piece 5
student 2 takes piece 6
student 1 takes piece 7
student 6 takes piece 8
student 6 orders a pizza
pizza ordered!
pizza delivered!
student 4 takes piece 1
student 3 takes piece 2
student 8 takes piece 3
student 7 takes piece 4
student 9 takes piece 5
student 5 takes piece 6
student 2 takes piece 7
student 6 takes piece 8
student 6 orders a pizza
pizza ordered!
pizza delivered!
student 0 takes piece 1
student 8 takes piece 2
student 7 takes piece 3
...
```
#### Ex3
Le but est d'implanter une architecture client/serveur en utilisant des tubes nommés. (Il existe pour cela
un autre mécanisme dédié à la communication locale interprocessus avec les sockets)
```
+-------------+
+----------> | clt1 pipe | --------------------------+
| +-------------+ |
| |
| +-- client1 <--+
| |
| |
| +-------------+ <-+
+-- serveur <-------- | serveur pipe| <---- client2 <-------+
| +-------------+ <-+ |
| | |
| | |
| +-- client3 <---+ |
| +-------------+ | |
+----------> | clt3 pipe | ---------------------------+ |
| +-------------+ |
| |
| +-------------+ |
+----------> | clt2 pipe | -------------------------------+
+-------------+
```
**Le serveur**
Il permet de consulter les notes d'étudiants à un examen d'ASR.
Il récupére en boucle les requêtes des clients dans un tube nommé `srv.pipe`. Pour écouter en boucle
les demandes des clients (lecture bloquante), le serveur ouvre le tube en mode lecture/écriture (il y a toujours
un écrivain, même lorsqu'on n'a plus aucun client).
Chaque requête est composée :
- du pid du client
- du numéro de l'étudiant dont on veut la note.
Pour chaque requête, le serveur crée un fils qui renvoie la note de l'étudiant correspondant à la requête, en utlisant
le tube nommé `/tmp/clt.pid`. On prendra soin de traiter correctement le signal `SIGCHLD`.
**Le client**
- Il crée le tube nommé pour la réponse à sa requête.
- Il envoie sa requête dans le tube `srv.pipe`.
- Il récupère la réponse du serveur dans son tube nommé, et le détruit.