1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
int p[2];
char buf[128];
if(pipe(p) == -1) {
fprintf(stderr, "Erreur avec pipe\n");
return EXIT_FAILURE;
}
printf("Pere cree deux processus fils qui vont se parler\n");
if(fork()) {
printf("Pere va cree le 2eme processus\n");
if(fork()) {
printf("Pere va attendre les deux fils\n");
/* Pere peut fermer le pipe, il ne s'en sert pas */
close(p[0]);
close(p[1]);
wait(NULL);
wait(NULL);
printf("Pere a termine\n");
}
else {
printf("Deuxieme fils va recevoir un message par le pipe\n");
/* 2eme fils: Ferme le pipe d'ecriture et l'entree standard */
close(0);
close(p[1]);
/* dup(p[0]) permet maintenant d'avoir l'entree du pipe comme entree standard */
dup(p[0]);
/* 2eme fils: on ferme p[0], il est maintenant en double... */
close(p[0]);
/* Lecture */
if(fgets(buf, sizeof(buf), stdin) != NULL) {
printf("2eme fils : %s\n",buf);
}
else {
printf("Erreur avec fgets\n");
}
/* On ferme le pipe */
close(0);
printf("2eme fils termine\n");
}
}
else {
int sortie;
printf("Premier fils va ecrire un message par le pipe\n");
/* 1er fils: Ferme le pipe d'ecriture et l'entree standard */
sortie = dup(1);
close(1);
close(p[0]);
/* dup(p[0]) permet maintenant d'avoir l'entree du pipe comme entree standard */
dup(p[1]);
/* 2eme fils: on ferme p[0], il est maintenant en double... */
close(p[1]);
printf("Bonjour, c'est genial!!!\n");
/* On remet la sortie standard et on ferme le pipe */
close(1);
dup(sortie);
close(sortie);
printf("1er fils termine\n");
}
return EXIT_SUCCESS;
} |
Partager