73 lines
2.2 KiB
C
73 lines
2.2 KiB
C
|
|
#include <stdio.h>
|
|||
|
|
#include <stdlib.h>
|
|||
|
|
#include <unistd.h>
|
|||
|
|
#include <sys/types.h>
|
|||
|
|
|
|||
|
|
int main(void) {
|
|||
|
|
int p[2]; // tube : p[0] lecture, p[1] écriture
|
|||
|
|
pid_t pf1, pf1f1, pf2;
|
|||
|
|
|
|||
|
|
pipe(p);
|
|||
|
|
|
|||
|
|
// --- créer Pf1 ---
|
|||
|
|
pf1 = fork();
|
|||
|
|
if (pf1 == 0) {
|
|||
|
|
// --- créer Pf1f1 ---
|
|||
|
|
pf1f1 = fork();
|
|||
|
|
if (pf1f1 == 0) {
|
|||
|
|
// Pf1f1 : lecteur
|
|||
|
|
close(p[1]); // ne garde que la lecture
|
|||
|
|
while (1) {
|
|||
|
|
pid_t v;
|
|||
|
|
read(p[0], &v, sizeof(v));
|
|||
|
|
int valeur = read(p[0], &v, sizeof(v));
|
|||
|
|
printf(" %d received %d\n", (int)getpid(), (int)v);
|
|||
|
|
fflush(stdout);
|
|||
|
|
sleep(1);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
close(p[0]);
|
|||
|
|
close(p[1]);
|
|||
|
|
while (1){
|
|||
|
|
pause();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// --- créer Pf2 ---
|
|||
|
|
pf2 = fork();
|
|||
|
|
if (pf2 == 0) {
|
|||
|
|
//Pf2 : écrivain
|
|||
|
|
close(p[0]); // ne garde que l’écriture
|
|||
|
|
pid_t cmoi = getpid();
|
|||
|
|
while (1) {
|
|||
|
|
printf("%d sent %d\n", (int)cmoi, (int)cmoi);
|
|||
|
|
fflush(stdout);
|
|||
|
|
write(p[1], &cmoi, sizeof(cmoi));
|
|||
|
|
sleep(3);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//P COMME PAPA
|
|||
|
|
close(p[0]);
|
|||
|
|
close(p[1]);
|
|||
|
|
while (1){
|
|||
|
|
|
|||
|
|
pause();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
printf(valeur);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Question 3 : (Envoyez le signal SIGSTOP à Pf2, puis le signal SIGCONT à Pf2)
|
|||
|
|
// Pour le premiere comportement quand je stop le processus pf2 avec un kill -STOP 211912 alors mon programme est comme en pause c'est normal car l'action du prcessus de pf1f1 dependait du tube qui relie donc comme il a rien a recevoir il attend.
|
|||
|
|
// Puis quand j'utilise SIGCONT le programme se debloque car le pf2 n'est plus gélé donc le pf1f1 peut lire les informations qu'on lui donne.
|
|||
|
|
|
|||
|
|
//(Envoyez le signal SIGSTOP à Pf1f1, puis le signal SIGCONT à Pf1f1.)
|
|||
|
|
//Lors du moment ou j'ai envoyer ce signal le processus pf2 continue d'envoyé ses information au processus pf1f1 sauf que lui comme il est gelé ne reagit pas à sa "requete".
|
|||
|
|
// Puis ainsi il rattrape tous ces requetes qui n'a pas pu repondre et du coup comme il est plus rapide que pf2 a la relance il a recup tous les pid possible comme dans le tube il etait rempli de ça donc il a lu les pid qui était la dans le tube.
|
|||
|
|
|
|||
|
|
|
|||
|
|
|