Ajout de l'exo 2 TP5

This commit is contained in:
Tom MOGULJAK 2023-10-11 15:10:22 +02:00
parent b3d9184a9a
commit 9467a67177
2 changed files with 111 additions and 0 deletions

View File

@ -462,6 +462,47 @@ ls . | wc -l
## Exercice 2 ## Exercice 2
> Soit le graphe de processus suivant (un tube est établi entre Pf2 et Pf1f1)
```
| 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 :
```
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.
- Envoyez le signal `SIGSTOP` à Pf2, puis le signal `SIGCONT` à Pf2.
> Le programme s'arrête d'écrire dans le tube, mais il continue de lire dans le tube sans afficher ce qu'il lit car il est bloqué en lecture.
- Envoyez le signal `SIGSTOP` à Pf1f1, puis le signal `SIGCONT` à Pf1f1.
> Le programme s'arrête de lire dans le tube, mais il continue d'écrire dans le tube.
- Envoyez le signal `SIGTERM` à Pf2.
- Envoyez le signal `SIGTERM` à Pf1f1.
## Exercice 3 ## Exercice 3
## Exercice 4 ## Exercice 4

70
TP5/Exo2/pipe-ex.c Normal file
View File

@ -0,0 +1,70 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
int main(int argc, char *argv[])
{
pid_t p;
int fd[2];
char c;
if (pipe(fd) == -1)
{
exit(1);
}
p = fork();
assert(p != -1);
int id = 0;
if (p == 0)
{
id += 2;
}
p = fork();
assert(p != -1);
if (p == 0)
{
id += 1;
}
if (id == 0)
{
wait(NULL);
wait(NULL);
}
if (id == 2)
{
wait(NULL);
}
while (id == 1)
{
int w = write(fd[1], &p, sizeof(pid_t));
assert(w == sizeof(pid_t));
printf("%d sent %d\n", p, p);
sleep(3);
}
while (id == 3)
{
int op;
int r = read(fd[0], &op, sizeof(pid_t));
assert(r == sizeof(pid_t));
printf("\t%d received %d\n", p, op);
sleep(1);
}
}