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 :

[Debutant]Probleme file de message


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Points : 91
    Points
    91
    Par défaut [Debutant]Probleme file de message
    Bonjour ,

    perror me dit que msgrcv est mauvais : Invalid argument

    Je ne comprends pas vraiment , j ai verifie les types des arguments ca m a l air bon ...

    est ce que ca viendrait du fait qu il n y a aucun message ds la file de messages ? Si c est le cas comment peut on verifier que la file de message soit vide ou pas ?
    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
     
     
    struct message{
      long type;
      char mtexte[1];
      int pid;
    };
     
    void clientarrive()
    {
      struct message client;
      int taille_message = sizeof(client) - sizeof(long);
      int pidclient;
     
      close(pipe_client_accueil[ECRITURE]);
      read(pipe_client_accueil[LECTURE],&pidclient,sizeof(int));
      close(pipe_client_accueil[LECTURE]);
     
      if (( msgrcv(msgid,&client,taille_message,0,0) ) == -1)
                perror("erreur :\n");
     
     
      printf("ne passe pas ici");
     
      if (client.pid == 0){ // je voulais dire si aucun message
           close(pipe_accueil_mecano[LECTURE]);
           write(pipe_accueil_mecano[ECRITURE],&pidclient,sizeof(int));
           close(pipe_accueil_mecano[ECRITURE]); 
           printf("%d",pidclient);
           }
     
          else {
                   client.pid = pidclient;
                   msgsnd(msgid,&client,taille_message,0);
                 }
     
     
      return ;
    }

  2. #2
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Points : 91
    Points
    91
    Par défaut
    Oh meme pas de reponses...

    Meme si il n y pas d erreurs dites le moi, que je cherche dans une autre direction...

  3. #3
    Débutant Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par Treuze
    Oh meme pas de reponses...

    Meme si il n y pas d erreurs dites le moi, que je cherche dans une autre direction...
    C'est peu etre compliqué...

  4. #4
    Membre régulier
    Inscrit en
    Mai 2004
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 103
    Points : 87
    Points
    87
    Par défaut
    je ne suis pas un expert masi regarder le man peut suffire ;-)

    alors ton deuxieme argument me semble invalide puisque le type requis est de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct msgbuf {
        long mtype;
        char mtext[1]
    };
    sinon errno contient le code d'erreur donc un printf devrait te permettre de connaître l'erreur et ainsi avec le man de savoir à quoi correspond l'erreur...

    voilà

  5. #5
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Treuze
    [......]
    if (( msgrcv(msgid, &client, taille_message, 0, 0) ) == -1)
    perror("erreur :\n");
    [......][/code]
    D'après le man "client" doit avoir un type défini comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     struct message {
        long type;
        char text[TAILLE_TEXTE]
    };
    Le tableau text[] doit avoir une taille de taille_message.

  6. #6
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Points : 91
    Points
    91
    Par défaut
    Roh je pensais qu on pouvais modifer cette structure comme je le voulais ...
    tt pis on fera de l'allocation pour un caractere inutile ...merci !

  7. #7
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Treuze
    Roh je pensais qu on pouvais modifer cette structure comme je le voulais ...
    tt pis on fera de l'allocation pour un caractere inutile ...merci !
    A vrai dire, moi aussi je suis un peu sceptique. Je pense que si c'était un problème de type, tu l'aurais vu à la compilation.
    Est-ce que la valeur de "msgid" est correcte (ainsi que son type) ?

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Points : 91
    Points
    91
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if ((msgid = msgget (123, IPC_CREAT | 0660)) == -1)
          perror();
    Apparement , pas d'erreur a ce niveau la ...

  9. #9
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Points : 91
    Points
    91
    Par défaut
    Bon en fait , il y a tjrs une erreur ... j ai modifie le code du premier post

    Edit : non l erreur vien tjuste du fait qu il n y arien ds la file de message , donc le programme s arrete...
    Comment faire pour ne pas avoir a attendre un message ???

  10. #10
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Si perror() se plaint de cette facon, c'est que msgrcv a positionne errno à
    Citation Envoyé par man msgrcv
    EINVAL Illegal msgqid value, or msgsz less than 0.
    Commence par declarer taille_message comme etant de type size_t, puisque c'est le type attendu par la fonction.
    Ensuite, regarde si msqid n'est pas modifie quelque part avant d'atteindre msgrcv() (vu la tete de ton code, cela a l'air d'etre une variable globale...).

  11. #11
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Points : 91
    Points
    91
    Par défaut
    Perror ne se plaint plus bizarrement

    Par contre, IPC_NOWAIT semble laisser contiuer le programme si aucun message n est dans la file ...
    Mais je cherche comment savoir si ma file de message est vide ou non

  12. #12
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Points : 91
    Points
    91
    Par défaut
    Bon il suffit en fait de faire un truc comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    client.pid = 0;
    msgget....
    if (client.pid ==0){...
    Merci de votre iade , j ai encore plein d erreurs ... donc je pense que je peux dire a bientot !

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

Discussions similaires

  1. [Debutant] No file Found - Probleme avec mon web xml ?
    Par cryosore dans le forum GWT et Vaadin
    Réponses: 4
    Dernier message: 19/01/2010, 13h41
  2. probleme file de message
    Par allezlolo dans le forum Débuter
    Réponses: 2
    Dernier message: 19/12/2008, 16h27
  3. Probleme semaphore+files de message
    Par ludo86 dans le forum C
    Réponses: 0
    Dernier message: 16/12/2007, 17h04
  4. Probleme file de message
    Par Treuze dans le forum C
    Réponses: 3
    Dernier message: 13/06/2006, 20h02
  5. [Debutant]Probleme ds file de message
    Par Treuze dans le forum C
    Réponses: 2
    Dernier message: 31/05/2006, 15h38

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