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
|
||||
|
||||
> 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 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