breizhbugs a écrit :
Plop,
* Si un seul processus produit le message et plusieurs le consomment, quand le retires tu de la file de message?
* Mets un IPC_NOWAIT et controle la valeur de retour du msgrcv pour avoir les details de l'erreur
* Fais péter le code pour plus d'aide... (bien que je ne sois pas un spécialiste ipc)
|
* L'échange de PID par la file de messages ne se fait qu'entre 2 processus seulement, donc personne d'autre ne lis ces messages. Qu'est ce que tu entends par retirer de la file de message ?? Je n'ai jamais réellement eu en tête le fait de supprimer un message de la file après qu'il ai été lu, je pensais qu'après avoir été lu, il se supprimait de lui même
* avec le IPC_NOWAIT, il m'affiche mon printf d'erreur et passe à la suite, par contre, lui, réussi bien a envoyer son PID a l'autre !
* voilà le code du processus "code" et celui de "choix" (je met que le passage en question, les fonctions et autres blabla sont pas utiles)
pour ce qui est des printf un peu partout, vu que débug du multiprocess avec GDB c'est pas trivial, j'ai foutu des printf un peu partout pour debug à la main !
Une dernière chose avant de regarder le vif du sujet : les ipcs sont créées par un processus a part, voila pourquoi ces 2 processus ne font que s'attacher aux différentes IPCs dont ils ont besoin
J'ai mis en gras le passage où le 1er processus se bloque en attente (ou bien renvoi -1 avec IPC_NOWAIT) mais je laisse les déclarations de variables au cas où il y aurait besoin.
CODE.C
57 int main()
58 {
59 int PIDchoix,t,sem_compteur,sem_phrase,sem_lettre,BAL,numeroPhrase,lettreCodage;
60 char phrase[65];
61 char conditionArret[]="stop";
62 char conditionArret2[]="STOP";
63 struct msgbuf
64 {
65 long mtype;
66 char mtext[65];
67 }message;
68 message.mtype=1;
69
70 signal(SIGUSR1,signal_ignore); /* deviation du signal */
71
72 //sem_compteur=semget(cle_compteur,1,0); /* attachement semaphore compteur */
73 sem_phrase = semget(cle_phrase,1,0); /* attachement semaphore phrase */
74 sem_lettre = semget(cle_lettre,1,0); /* attachement semaphore lettre */
75 t = open("TUBE",O_RDONLY); /* attachement au tube nomme */
76 BAL = msgget(cle_BAL,0666); /* attachement a la boite au lettre */
77
78 //up(sem_compteur); /* incrementation du compteur */
79
80 //echange PID
81 printf("debut echange PID\n" );
82 sprintf(message.mtext,"%d", getpid());
83 printf("%s est mon PID\n",message.mtext);
84 if((msgsnd(BAL,&message,sizeof(message.mtext),0))==-1)
85 printf("ERREUR ENVOI PID" );
86 printf("PID envoye\n" );
87 if((msgrcv(BAL,&message,100,2,IPC_NOWAIT))==-1)
88 printf("ERREUR RECEPTION PID\n" );
91 printf("%s est le PIDchoix\n",message.mtext);
92 PIDchoix=atoi(message.mtext);
93 printf("fin echange PID\n\n" );
94 //fin echange PID
voila le bout de code du processus faisant l'échange de PID (chez lui aucun prob, il recoit et envoi son message sans m'afficher aucun message d'erreur) :
CHOIX.C
27 int main()
28 {
29 int sem_compteur,sem_lettre,sem_phrase,BAL,PIDcode,numeroPhrase,lettreCode;
30 char conditionArret[]="stop";
31 struct msgbuf
32 {
33 long mtype;
34 char mtext[65];
35 }message;
36 message.mtype=2; /* choix : message de type 2 */
37
38 srand(time(NULL)); /* initialisation compteur random */
39 signal(SIGUSR1,signal_ignore); /* deviation du signal SIGUSR1 */
40 //sem_compteur=semget(cle_compteur,0666); /* attachement semaphore compteur */
41 sem_lettre = semget(cle_lettre,1,0); /* attachement semaphore lettre */
42 sem_phrase = semget(cle_phrase,1,0); /* attachement semaphore phrase */
43 BAL=msgget(cle_BAL,0666); /* attachement boite au lettres */
44
45 //semop(...&up(sem_compteur)); /* incrémentation compteur */
46
47
48 /* echange PID */
49 printf("debut echange PID\n" );
50 msgrcv(BAL,&message,100,1,0);
51 printf("%s est le PID de code\n",message.mtext);
52 PIDcode=atoi(message.mtext);
53 printf("PID recu\n" );
54 sprintf(message.mtext,"%d",getpid());
55 printf("%s est mon PID\n",message.mtext);
56 //if((msgsnd(BAL,&message,sizeof(message.mtext),0))==-1)
57 //printf("ERREUR ENVOI" );
58 printf("FIN echange PID\n" );
59 /* fin echange PID */
Merci encore de votre aide, si qqun arrive à comprendre, ça pourrait bien m'aider pcq là ... je sèche totalement ...