IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème messagequeue Posix


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Par défaut Problème messagequeue Posix
    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

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gillD Voir le message
    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
    Je connais pas mqueue mais j'ai travaillé avec les msg et je sais qu'il existe des fonctions de contrôle (msgctl) pour contrôler la file (la purger entre autre)...

    PS: J'aime bien ta macro "#define FOREVER while(1)". En général ça rend le code plus illisible que le gain réel dans l'écriture...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    msgctl(), c'est pour les message queues System V, pas les message queues POSIX.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    msgctl(), c'est pour les message queues System V, pas les message queues POSIX.
    Il ne s'agissait que d'une analogie destinée à donner l'idée qu'une fonction équivalente pourrait exister pour les mqueue. Mais c'est vrai que j'aurais pu le préciser
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Par défaut
    Merci
    mais sinon quelqu un a une reponse

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 25
    Par défaut
    J'ai utilisé mq_unlink au demarrage de l appli :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if((mqid = mq_open(MQNAME,O_CREAT|O_RDWR|O_EXCL,0644,&mqArch)) == (mqd_t)ERROR)
    	{
    		if((mqid = mq_unlink(MQNAME)) == -1) {perror("pb ouverture/creation mqueue");
    		exit(errno);}
     
    		if((mqid = mq_open(MQNAME,O_CREAT|O_RDWR|O_EXCL,0644,&mqArch)) == (mqd_t)ERROR)
    		{perror("pb ouverture/creation mqueue");
    		exit(ERROR);}
    	}
    O_EXCL permet de savoir si la message queue existe , si c' est le cas elle est supprimée et je la recrée.

    Pour info , "FOREVER" c'est ce qui est utilisé sous VxWorks. C'est juste une habitude

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 17/01/2008, 02h02
  2. Problème :MMAP / Posix sous Windows
    Par Niluje__ dans le forum C
    Réponses: 4
    Dernier message: 26/09/2007, 18h01
  3. [Posix] problème librairie posix edition de lien
    Par hortensinette dans le forum Développement OS X
    Réponses: 1
    Dernier message: 12/04/2007, 15h57
  4. Problème de sockets POSIX
    Par shuygar dans le forum Réseau
    Réponses: 6
    Dernier message: 26/07/2006, 16h46
  5. Problème sémaphore POSIX en C++
    Par yakotey dans le forum C++
    Réponses: 5
    Dernier message: 15/12/2005, 15h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo