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

Linux Discussion :

files de messages


Sujet :

Linux

  1. #1
    Membre confirmé Avatar de ludo86
    Homme Profil pro
    Développement applications iOS/android
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développement applications iOS/android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut files de messages
    Bonjour j'ai un problème en ce qui concerne les files de message.
    J'ai un processus X qui doit envoyer à un processus Y un message via ce procédé.

    Pour être sur que la transmission se fait bien, je crée une boucle do while tant que le message n'est pas transmis.
    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
     
    typedef struct{
    	long type;
    	int numPiste;
    	int numTarmac;
    }Reponse_controleur;
    ...
    int tailleMsgC_bis=sizeof(msgC_bis);
    ...
    if((msgidPISTE_TARMAC=msgget(/*(key_t)*/Moi.cle,IPC_CREAT|0600))==-1){
    		printf("Pb msgget 1-controleur.c\n");	
    		exit(1);
    	}
    ...
    /********************************************************************************************************/
    /*Ici ça boucle une fois ensuite ça sort de la boucle et ça affiche bien 'Je suis sorti de la boucle...'*/
    /********************************************************************************************************/
    				do{printf("No\t%d.\n",getpid());}while(msgsnd(msgidPISTE_TARMAC,&msgC_bis,tailleMsgC_bis,0)==-1);
    			//le controleur sors de la boucle.
    			printf("Je suis sorti de la boucle moi le controleur %d.\n",getpid());
    Le problème est que la boucle qui envoie le message boucle une fois et puis sort ensuite( l'envoie du message se passe alors bien).
    Cependant, en ce qui concerne la boucle qui reçoit, elle boucle un certains nombre de fois puis après plus rien et j'entends le ventilateur de l'ordinateur tourner à mort.

    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
     
    typedef struct{
    	long type;
    	int numPiste;
    	int numTarmac;
    }Reponse_controleur;
    ...
    Reponse_controleur msgC_bis;
    ...
    tailleMsgC_bis=sizeof(msgC_bis);
    ...
    if((msgidPISTE_TARMAC = msgget(msgC.cle, 0))==-1){
    			printf("Probleme lors de la creation des files de messages.-avion v2.c\n");exit(1);
    		}
    ...
    /************************************************************************************************/
    /*Blocage ici la boucle fait une fois un essai et puis après plus rien. Et je sais  pas pourquoi.                                                                                               /************************************************************************************************/
    		do
    		{
    			printf("NO\t%d,\t%d\n",getpid(),msgrcv(msgidPISTE_TARMAC,&msgC_bis,tailleMsgC_bis,msgC_bis.type,0)),sleep(1),fflush(stdout),fflush(stdin);
    		}while(msgrcv(msgidPISTE_TARMAC,&msgC_bis,tailleMsgC_bis,msgC_bis.type,0)==-1);
    		//jamais le programme ne franchit ce seui.
    		printf("J'ai bien reçu le message du controleur qui m'attribu la place de tarmac %d et de piste %d.\nMoi l'avion %d\n\a",msgC_bis.numTarmac,msgC_bis.numPiste,getpid());
    Aurais je fais une erreur dans ma boucle de réception?

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    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 815
    Billets dans le blog
    1
    Par défaut
    Un objet "file de message" contient
    • un long qui représente le "type" du message et qui ne doit pas être à 0

    • le corps du message

    Il ne me semble pas voir comment tu remplis cet entier dans ton code. Par ailleurs, et c'est une subtilité importante, la taille qu'on passe en 3° paramètre à "msgsnd()" ne doit pas tenir compte de la taille de cet entier.

    Et pour réceptionner un message par msgrcv(), il faut passer une valeur "n" représentant le type du message demandé avec
    • n = 0 => récupère le premier message de la file

    • n > 0 => récupère le premier message de la file de type "n"

    • n < 0 => récupère le premier message de la file dont le type est inférieur à la valeur absolue de "n"
    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
    Membre confirmé Avatar de ludo86
    Homme Profil pro
    Développement applications iOS/android
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développement applications iOS/android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    Désolé de la réponse si tardive.
    Je regarde ça...
    Cependant en corrigeant l'erreur de la non présence du type de message, j'ai toujours le même problème.
    De plus, ce qui m'agace un peu c'est que, je fais la meme chose 6 lignes plus haut et que ça fonctionne et là ça me plante comme un poignard entre les 2 omoplates.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    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 815
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ludo86 Voir le message
    Désolé de la réponse si tardive.
    Je regarde ça...
    Cependant en corrigeant l'erreur de la non présence du type de message, j'ai toujours le même problème.
    De plus, ce qui m'agace un peu c'est que, je fais la meme chose 6 lignes plus haut et que ça fonctionne et là ça me plante comme un poignard entre les 2 omoplates.
    Ce n'est pas parce qu'un code "fonctionne" qu'il est bien écrit. Si le membre "type" contient "par hasard" une valeur qui n'est pas 0 ben ça fonctionne "par hasard". Et 6 lignes plus bas ben ton membre "type" a "par hasard" changé et est passé à 0.
    La commande "ipcs" peut te renseigner sur le contenu de tes ipc.

    Sinon voici comment moi je gère une file de message
    1) je commence par créer une structure qui contient mon info perso
    2) je crée la structure qui sera intégrée dans la file de message et qui contient
    - le type
    - mon info
    Comme ça, je ne me mélange pas les pinceaux entre "ce qui est pour la file" et "ce qui est pour moi". Et quand j'appelle msgsnd(), je lui passe la taille de mon info puisque msgsnd ne veut que la taille de l'info utile et non la taille totale du message (taille qui comprend les 4 octets du type)
    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]

Discussions similaires

  1. Réponses: 5
    Dernier message: 24/05/2006, 15h41
  2. [Debutant]Probleme file de message
    Par Treuze dans le forum C
    Réponses: 11
    Dernier message: 15/05/2006, 21h46
  3. Créer plusieures file de message différentes
    Par progamer54 dans le forum Linux
    Réponses: 6
    Dernier message: 06/04/2006, 15h36
  4. Réponses: 8
    Dernier message: 09/02/2006, 18h51
  5. IPC : Files de messages et accès exclusif
    Par thomasvst dans le forum C
    Réponses: 2
    Dernier message: 07/12/2005, 09h47

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