Hello,
pour un projet, je dois synchroniser des processus. Pour cela, j'utilise des IPC pour qu'il echange aussi quelques informations. Seulement, je sais pas pkoi, j'ai un souci sur un file IPC, alors qu'une autre du projet fonctionne.
Dans le main.c j'ai :
La cle est definie par un define (pour etre sur que le prob ne vient pas de la).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if(( msgid = msgget(cle,IPC_CREAT | IPC_EXCL | 0777)) == -1){ erreurFin("Pb msgget !"); } sprintf(cmd,"gnome-terminal -e \"./controlleur %s\";",nomProjet); system(cmd);
Dans le controlleur.c j'ai :
Le role du controlleur.c est de traiter les requetes des autres processus et de leur fournir une reponse en fonction de ce qu'ils demandent.
Code : 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 typedef struct{ pid_t pidEmetteur; int acces; long type; char nomFichier[TAILLE_MAX_FICHIER]; }trequeteControlleur; int main(){ if( ( msgid = msgget(cle,0)) == -1){ printf("Pb msgget !"); } //....//// while(1){ printf("En attente d'une requete \n"); msgrcv(msgid,&req,tailleReq,2,0); printf("Lecture de requete de type : %d \n",req.acces); char commande[200]; char nomJournal[28]; printf("on cree une reponse pr la demande de creation de document\n"); sprintf(nomJournal,"%sjournal",nomFichier); sprintf(commande,"touch ./%s/fichier/%s; touch ./%s/fichier/%s;",nomProjet,nomFichier,nomProjet,nomJournal); system(commande); sprintf(commande,"echo %s >> %s/fichier/ListeFichier.txt",nomFichier,nomProjet); system(commande); tabDocument[num] = 1; rep->numSem = num; rep->type = (long)pidE; msgsnd(msgid,&rep,tailleRep,0); } }
La procedure qui se sert qui envoie une requete :
Cette procedure est dans le main.c. Elle connait donc msgid et les structures sont bien defini et identique a controlleur.c
Code : 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 void creationDocument(){ char nomFichier[TAILLE_MAX_FICHIER]; trequeteControlleur req; treponseControlleur rep; int tailleReq, tailleRep; tailleReq = sizeof(trequeteControlleur) - sizeof(long); tailleRep = sizeof(treponseControlleur) - sizeof(long); printf("Quel est le nom du fichier à ajouter :"); scanf( "%s", nomFichier ); req.type = 2; req.pidEmetteur = getpid(); sprintf(req.nomFichier,"%s",nomFichier); req.acces = 1; printf("demande de creation\n"); msgsnd(msgid,&req,tailleReq,0); printf("attente de reponse\n"); msgrcv(msgid,&rep,tailleRep,(int)getpid(),0); printf("reponse semaphore %d \n",rep.numSem); }
Lorsque je teste mon programme, la procedure creationDocument recoit une reponse alors que le controlleur ne recoit pas la requete. Je ne sais pas si le fait que je lance mon controlleur en faisant un gnome-terminal -e change qqch a l'histoire ou si l'erreur vient d'ailleurs. Les flags de msgsnd et msgrcv ? Je galere sur ce prob depuis 2jours sans trouver de reponse.
PS : je suis sur opensolaris.
Merci a tous ceux qui se penchent sur mon cas ^^.
Partager