Skip to content

Instantly share code, notes, and snippets.

@danielrubango
Last active July 16, 2018 18:29
Show Gist options
  • Save danielrubango/bf84d95643794b3ae04a3d0b2f62211a to your computer and use it in GitHub Desktop.
Save danielrubango/bf84d95643794b3ae04a3d0b2f62211a to your computer and use it in GitHub Desktop.
Petit programme écrit en C, créant des processus et démontrant l'echange des messages entre processus
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
/* Function: decimalVers
* ---------------------
* Convertit un nombre de base decimale en un autre de base quelconque inférieur à 8 et l'affiche
*
* n: Nombre à convertir
* base: Base de convertion
*/
void decimalVers(int n, int base) {
// Stocker le nombre binaire
int binaire[10000], i = 0;
// Conversion
while (n != 0) {
binaire[i] = n % base;
n /= base;
i++;
}
// Affichage
for (int j = i-1; j >= 0; j--) {
printf("%d", binaire[j]);
}
printf("\n");
}
int main(void)
{
// Initialisation
pid_t fils1, fils2;
int descripteur1[2];
int descripteur2[2];
int somme, a, b;
// Descripteurs
pipe(descripteur1);
pipe(descripteur2);
if (pipe(descripteur1) != 0) {
fprintf(stderr, "Erreur de creation tube");
return EXIT_FAILURE;
}
if (pipe(descripteur2) != 0) {
fprintf(stderr, "Erreur de creation tube");
return EXIT_FAILURE;
}
// Creation du premier processus fils 1
fils1 = fork();
if (fils1 == -1) {
fprintf(stderr, "Erreur de creation");
return EXIT_FAILURE;
}
if (fils1 == 0) { // Premier fils
printf("Entrez le premier entier, a: ");
scanf("%d", &a);
printf("Entrez le premier entier, b: ");
scanf("%d", &b);
somme = a + b;
close(descripteur1[0]);
close(descripteur2[0]);
// Enregistrement de la somme pour envoi au fils et au pere
write(descripteur1[1], &somme, sizeof(int));
write(descripteur2[1], &somme, sizeof(int));
printf("____________________________________________________\n");
printf("J'envoie la somme de %d + %d à mon père et mon frère \n", a, b);
printf("____________________________________________________\n");
close(descripteur1[1]);
close(descripteur2[1]);
} else {
wait(0);
// Creation processus fils 2
fils2 = fork();
if (fils2 == 0) { // Second fils
close(descripteur1[1]);
int somme1;
read(descripteur1[0], &somme1, sizeof(int));
// Verification de la parite
if (somme1 % 2) {
printf("\nLa somme %d est impaire.\n", somme1);
} else {
printf("\nLa somme %d est paire.\n", somme1);
}
printf("La somme reçu par le deuxieme fils a comme valeur octale ");
decimalVers(somme1, 8);
close(descripteur1[0]);
} else { // Pere
wait(0);
close(descripteur2[1]);
int somme2;
read(descripteur2[0], &somme2, sizeof(int));
printf("\nLa somme reçu par le pere est %d, qui vaut en binaire ", somme2);
decimalVers(somme2, 2);
close(descripteur2[0]);
}
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment