Bonjour ,
j utilise des mqueue Posix et j ai un souci:
j ai 2 taches . L une envoie des infos(une structure) , l'autre recupere l info.
Mon programme n est pas encore au point donc quand il plante , si je relance l appli , la tache de reception ne bloque plus sur mq_receive et elle me donne de mauvaises valeurs

Voici le debut de ma tache de reception
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
37
38
39
40
41
42
43
44
45
46
47
48
void * archivage_ncdf()
{
	int Etat;
	TRAME *new_trame;
	/*Variables pour mqueue*/
	struct mq_attr mqArch;
	mqd_t mqid;
	/*instanciation structure mq_attr*/
	mqArch.mq_maxmsg = 10;
	mqArch.mq_msgsize = sizeof(TRAME);
	mqArch.mq_flags = 0;
	mqArch.mq_curmsgs = 0;
	
	int i , j , k , l , trouve;
	
	/*ouverture / creation du messagequeue*/
	if((mqid = mq_open(MQNAME,O_CREAT|O_RDWR,0644,&mqArch)) == (mqd_t)ERROR)
	{
		perror("pb ouverture/creation mqueue");
		exit(ERROR);
	}
	else puts("CREATION OK\n");
	
	/*autorise la tache principale a detruire ce thread*/
	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
  	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
	
	FOREVER
	{ 
		/*reception trame */
		new_trame = (TRAME*)malloc(sizeof(TRAME));
		bzero(new_trame,sizeof(new_trame));
		
		/*if((mqid = mq_open(MQNAME,O_RDONLY)) == (mqd_t)ERROR){perror("pb reouverture mqueue");exit(ERROR);}*/
		
		if ((Etat = mq_receive(mqid,(void *)new_trame,sizeof(TRAME),NULL)) == -1) 
			{
				if(mq_close(mqid) == ERROR) 
				{perror("pb ouverture/creation mqueue");exit(ERROR);}
				free(new_trame);
				perror("pb reception mqueue");exit(ERROR);
			}	
		else printf("RECEPTION OK");


           TRAITEMENT DES INFOS
          }
}
et la fin de la tache qu boucle aussi en permanence et qui envoie le message
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
/*envoi de la structure trame dans le mqueue*/
			if((mqid = mq_open(MQNAME,O_WRONLY))== (mqd_t)ERROR)
			{perror("pb ouverture mqueue extract");exit(ERROR);}
			else puts("OUVERTURE MQEXTRACT OK");
			if((mq_send(mqid,(void*)&trame,sizeof(trame),31)) == ERROR) 
			{perror("mq_send extract");exit(ERROR);}
			else puts("ENVOI OK");
la message queue est creee dans la tache de reception qui est lancee en premiere
elle devrait ensuite etre en attente d un message et effectuer son son traitement
Il doit rester des valeurs de l utilisation precedente mais comment effacer ces valeurs