[C] Tablures et tuyaux

Fermé
Stéphanie - 24 juin 2006 à 16:52
crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 - 25 juin 2006 à 11:26
Bonjour,

j'essaye de faire un exo mais je n'arrive pas à le démarrer.
Si vous pouviez m'indiquer comment m'y prendre.

Merci d'avance


On veut tester une fonction de génération aléatoire d'entiers (allea) et l'on veut savoir si la somme des nombres entiers produits est égales à la somme des nombres impairs produits et ce pour 10 000 tirages.
Le prototype de la fonction est : int allea(); nous est fournis dans une librairie partagée allea.so
Le processus P1 écrit 10 000 nombres produit par allea sur la sortie standart.
Le processus P2 lit des nombres sur l'entrée standart et écrit les nombres pairs sur la sortie standart et les nombres impairs sur la sortie erreur standart.
Les processus P3 et P4 somment l'ensemble des nombres lus sur l'entrée standart et écrivent la somme sur la sortie standart.
Le processus P5 lit 2 nombres sur l'entrée standart et les comparent. Si ils sont égaux, l'exit status sera zéro et un si ils sont différents.

1)Ecrire le programme de l'executable Pi
2)Ecrire le programme qui lance l'ensemble des processus, créer les tubes et réalise les bonnes connections avec fermeture de tous les descripteurs inutiles.
3)Ecrire les commandes de compilation.

3 réponses

crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 507
24 juin 2006 à 17:16
Salut,
Commences par faire un schéma en dessinant chaque processus par une patate
ou tu repères pour chaque processus l'entrée standard (sur la gauche) et les
sorties standard et d'erreur sur la droite.
Ensuite tu représentes les flux unidirectionnels de dialogue (une sortie d'un
processus vers l'entrée d'un autre) en indiquant ce qui passe : un nombre,
un nombre pair, etc...
Par la suite, le programme qui va lancer tout-ça devra s'occuper de créer
les tubes et d'affecter au besoin les entrées et les sorties sur les tubes (en réalité
c'est une duplication de file descripteur) :
Si tu es sous UNIX :
- créer un processus fork()
- créer un tube : pipe()
- dupliquer des file descriptors : dup() ou dup2()
- se remplacer par un autre processus : exec()

L'avantage d'une telle solution c'est qu'il n'y a que le lanceur qui est
complexe, les autres c'est des processus simples.
A+, crabs
0
Bonjour,

Ce que je ne comprends pas c'est comment on récupère les chiffres de la fonction allea pour les redirigés sur la sortie standart ou erreur standart selon le chiffre que l'on obtient
0
crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 507
25 juin 2006 à 11:26
Salut,
Pour la sortie standard :
int nb ;

nb = allea() ;
write( 1, &nb, sizeof( int ) ) ;

Pour la sortie d'erreur, il faut remplacer 1 par 2.
Pour tester si le nombre est pair
if ( nb % 2 == 0 )
    {
    /* traitement pour un nombre pair */
    }
else
    {
    /* traitement pour le nombre impair */
    }

A+, crabs
0