Ajout de l'exo 2 TP5
This commit is contained in:
parent
b3d9184a9a
commit
9467a67177
41
README.md
41
README.md
@ -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
70
TP5/Exo2/pipe-ex.c
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user