apaachee a écrit :
Comment rajouter les pipes dans ce programme ? Les documentations que j'ai lu, je n'ai pas comprit grand chose ...
|
Il y a 2 façons de faire un pipe
1) un fichier pipe sur disque puis un processus y écrit et un autre le lit
2) un pipe entièrement en mémoire. Cette 2° façon est limitée aux seuls processus liés père/fils (mais c'est possible puisque c'est ton cas)
Donc à toi de choisir quelle façon faire puisque t'as possibilité de faire les deux. Perso je choisirais la 2° puisque ça m'évite de m'embêter à créer un fichier.
Donc la technique de base pour communiquer entre un père et son fils
1) le programme commence par créer le pipe mémoire grace à la fonction pipe() à laquelle il passe un int tab[2]
Cette fonction se charge de créer le pipe et d'allouer tab[0] comme point de lecture et tab[1] comme point d'écriture
2) le programme génère son fils grace à fork(). Le fils reçoit donc une copie de la mémoire du père donc de tab
3) le processus qui devra écrire ferme tab[0] et celui qui devra lire ferme tab[1]
4) celui qui écrit fait du write(tab[1], zone, nb_octets) et celui qui doit lire fait du read(tab[0], zone, nb_octets)
5) une fois que c'est fini, chaque processus ferme son tab[x] utilisé
Pour toi qui doit faire "n" fils, t'auras besoin de "n" tab[2] donc int tab[n][2]. Ca risque de devenir galère. C'est pourquoi je te conseillerais de définir un type t_pipe
Code :
- typedef struct {
- int cote[2];
- } t_pipe;
|
Comme ça, tu n'as plus qu'à créer un t_pipe pipe[n] puis chaque fils "x" ira lire dans pipe[x - 1].cote[0] et écrire dans pipe[x].cote[1] (enfin j'espère que tu vois le principe)
Petite doc sur les pipes: http://fr.lang.free.fr/cours/Processus_Csyst_v1.0.pdf
Message édité par Sve@r le 07-06-2009 à 10:57:29
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.