Bonsoir,
DELETE
Bonsoir,
DELETE
en gros, vu que tu as un unique fils à chaque étape, je te conseillerais de faire ceci
c'est pas forcemment exactement la syntaxe... juste les idées dans un premier temps
et faut ajout les controles d'erreur...
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 function fils(int t[2], int etage) { /* je ne sais pas si tu veux communiquer vers le père pour renvoyer ton résultat il peut y avoir deux tuyaux... */ /* boulot eventuel */ switch (etage) { // ça se trouve un if (etage < seuil) suffirait case 0: ... case N: int tuyau[2]; pipe(tuyau); switch (fork()) { case 0: close(tuyau[LECTURE]); /* action */ write(tuyau[ECRITURE], resultat); default: close(tuyau[ECRITURE]); fils(tuyau, etage+1); } default: /* on stoppe de propager */ } }
ok, excuse moi de te le demander mais j'aimerais mieux comprendre le problème à résoudre car j'ai l'impression que ton blocage est plutot conceptuel
passionné de développement
Ok, je ne connais pas les rôles de chacun de tes process pDirection, pAccueil... mais je vais essayer de te donner une réponse par rapport à la hierarchie de création et communication.
En effet vu la hierarchie de création
pDirection (père) -> pAdmin (fils) -> pAccueil -> pGuichet
Pour qu'il puisse communiquer avec les autres processus par signaux, il faut absolument qu'il stocke leur pid quelque part, c'est à dire tu peux creer une table de pid_t accessible à pDirection qui stocke les pid des different process de ton appli, de telle façon qu'il puisse envoyer un signal à qui il veut quand il le veut
par la suite tu veux que les 3 autres communiquent par tube, cela est possible, mais il faudra créer autant de tube que de communication c'est à dire, un tube pour la communication
pAdmin (fils) - pAccueil (2 tube si tu veux la communication bidirectionnelle)
un tube pour la communication
pAccueil - pGuichet (2 tube si tu veux la communication bidirectionnelle)
un tube pour la communication
pAdmin (fils) -pGuichet (2 tube si tu veux la communication bidirectionnelle)
Pour te faciliter la tache, il suffira de déclarer les tableaux de descripteurs de tubes dans le code de pAdmin pour qu'ils soient accessibles de tous les 3 process.
Maintenant dis-moi, dans ton projet (conception), à quoi te servent ces differnts processus?
passionné de développement
salut, heureux de savoir que je te suis d'une quelconque aide.
Bon si tu veux limiter les participants à la conversation sur un tuyau donné, il te suffit de fermer les descripteurs hérités en lecture et ecriture pour ce processus par exemple, dans ton projet tu voudrais que pAdmin et pAccueil se partage un tuyau (pAdmin lecteur et pAccueil ecrivain), mais que les autres ne l'utilisent pas, alors avant que pAdmin ne crée pAccueil, mais que pGuichet ne le voit pas tu a le code
MA BALISE CODE N'EST PAS ACTIVE
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
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 .... pipe(AdminAccueil) accueil = fork() if(!accueil) /* on est dans accueil */ { /* Tu ferme la lecture */ close(AdminAccueil[0]); /* Maintenant aucun fils de pAccueil ne verra le descripteur en lecture de AdminAccueil */ .... .... /* Tu crées un tube pour pAccueil et pGuichet */ /* exemple pAccueil est ecrivain et pGuichet lecteur */ pipe(AccueilGuichet); guichet = fork(); if(!guichet) /* On est dans pGuichet */ { /* Tu ferme le descripteur en ecriture de AccueilGuichet, mais aussi le descripteur en ecriture de AdminAccueil qu'il herite de naissance */ close(AccueilGuichet[1]); close(AdminAccueil[1]); .... .... } else /* On est dans pAccueil */ { /* Tu fermes le descriteur en lecture */ close(Accueiluichet[0]); ... ... } } else /* On est dans pAdmin */ { /* Tu fermes le descripteur en ecriture */ close(AdminAccueil[1]); ... ... }
Maintenant tu es prêt à avoir une communication ien répartie dans laquelle pAccueil voit les 2 tubes et chacun des 2 des autres voit uiquement son interface avec pAccueil.
Si maintenant tu veux multiplier les tubes entre 2 process, tu le fais au même endroit que le premier crée mais tu n'oublie pas de les rendre innaccessibles de ceux qui ne sont pas concerné.
Par contre si tu a par exemple 5 guichets dans ton appli, chacun des process représentants un guichet doit etre crée par pAccueil et avoir son tube de communication avec lui, en plus tu devras toi-même definir un protocole pour la distribution des messages sur chacun des tubes
J'ai pour l'instant un petit prob avec mon firewall et j'ai de la peine à download sans son avis je ferai tout de même l'effort de telecharer ton pdf pour pouvoir t'apporter une meilleure aide entre temps debrouilles toi avec ces bribes et bonne chance...
passionné de développement
Bonjour,
- Quel est le comportement attendu et quel est le comportement obtenu ?
- Il faudrait résoudre ces warnings obtenus avec -Wextra -Wall -O2 :
Jcwow.c:1:20: error: struct.h: No such file or directory
wow.c: In function 'gest_sign_guichet':
wow.c:17: warning: implicit declaration of function 'printf'
wow.c:17: warning: incompatible implicit declaration of built-in function 'printf'
wow.c:19: warning: implicit declaration of function 'sleep'
wow.c: In function 'main':
wow.c:41: warning: implicit declaration of function 'system'
wow.c:43: warning: incompatible implicit declaration of built-in function 'printf'
wow.c:47: warning: implicit declaration of function 'pipe'
wow.c:52: warning: implicit declaration of function 'sprintf'
wow.c:52: warning: incompatible implicit declaration of built-in function 'sprintf'
wow.c:66: warning: implicit declaration of function 'getpid'
wow.c:68: warning: implicit declaration of function 'sscanf'
wow.c:68: warning: incompatible implicit declaration of built-in function 'sscanf'
wow.c:75: warning: implicit declaration of function 'fork'
wow.c:81: warning: implicit declaration of function 'execl'
wow.c:81: warning: incompatible implicit declaration of built-in function 'execl'
wow.c:81: error: 'NULL' undeclared (first use in this function)
wow.c:81: error: (Each undeclared identifier is reported only once
wow.c:81: error: for each function it appears in.)
wow.c:81: warning: missing sentinel in function call
wow.c:83: warning: implicit declaration of function 'exit'
wow.c:83: warning: incompatible implicit declaration of built-in function 'exit'
wow.c:93: warning: incompatible implicit declaration of built-in function 'execl'
wow.c:93: warning: missing sentinel in function call
wow.c:95: warning: incompatible implicit declaration of built-in function 'exit'
wow.c:105: warning: incompatible implicit declaration of built-in function 'execl'
wow.c:105: warning: missing sentinel in function call
wow.c:116: warning: implicit declaration of function 'close'
wow.c:37: warning: unused variable 'numVoy'
wow.c:34: warning: unused variable 'nf'
wow.c:34: warning: unused variable 'nb'
wow.c:34: warning: unused variable 'j'
wow.c:33: warning: unused parameter 'argc'
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager