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

Langage C++ Discussion :

Select et list/FIFO.


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 50
    Par défaut Select et list/FIFO.
    Bonjour a tous!

    Je viens vers vous pour un probleme de select. En effet, j'ai un programme qui fait communiquer different processus entre eux a travers des IPC. Des messages queues pour etre precis. (Ca peut s'apparenter a des listes).

    Ma question est: Est il possible d'utiliser un select pour savoir quand des elements ont ete rajouter sur cette FIFO? Et plus généralement avec les list de la STL?


    Si ca fonctionnait, ca me permettrait de faire un truc vachement plus propre! A moins que vous ayez une solution plus classe a proposer, je suis aussi preneur

    Merci d'avance pour vos reponses!

    edit: Petit precision de taille, je suis sous linux pour coder ^^

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Si ce sont des message queue POSIX et non pas des messages queues System V, et que tu es bien sous Linux, alors oui, les messages queues sont pollables.

    Citation Envoyé par man 7 mq_overview
    On Linux, a message queue descriptor is actually a file descriptor, and can be monitored using select(2), poll(2), or epoll(7). This is not portable.
    (le gras est de moi)
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 50
    Par défaut
    Ben j'ai essaye de faire un programme de test. Dans un programme pere, je creer ma message queue, je push dessus, je fork un autre programme avec un exec, ou je recois les message. Et donc dans le pere je fais un select sur le fd de la MQ, et je push dans mon autre programme. Et ca ne debloque pas le select.. Je sais pas d'ou ca vient!

    Aurais tu un exemple de code qui fonctionne? a tout hazard ^^

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Non, je n'ai pas de code, mais ça devrait parcher tout seul. Peux tu poster ton code à toi ?

    Edit: confirme quand même un point : tu utilises bien une MQ Linux (mq_open(), mq_receive()...), et pas une MQ System V (msgget,...)
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 50
    Par défaut
    Hey bien j'ai utiliser le system V avec les msgget etc. Je ne comprend pas pourquoi ca ne fonctionne pas avec un le fd d'un system V. En plus, dans ts les exemples que j'avais pu trouver (tu me dira j'avais ptet pas assez chercher), c'etait avec le system V, et aucun avec mq_open etc. J'en avais meme jamais entendu parler,c'est pour dire...

    Il faut que je refasse mon truc avec des mq_open alors? Ca marche de la meme facon que le system V? (Si tu a un site avec des exemples, je suis preneur)

    en tout cas, merci de tes interventions, tu m'aide beaucoup! Je comprend vraiment pas pourquoi les fd des msgget ne fonctionne pas avec le select.

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Baradhur Voir le message
    Hey bien j'ai utiliser le system V avec les msgget etc. Je ne comprend pas pourquoi ca ne fonctionne pas avec un le fd d'un system V. En plus, dans ts les exemples que j'avais pu trouver (tu me dira j'avais ptet pas assez chercher), c'etait avec le system V, et aucun avec mq_open etc. J'en avais meme jamais entendu parler,c'est pour dire...

    Il faut que je refasse mon truc avec des mq_open alors? Ca marche de la meme facon que le system V? (Si tu a un site avec des exemples, je suis preneur)

    en tout cas, merci de tes interventions, tu m'aide beaucoup! Je comprend vraiment pas pourquoi les fd des msgget ne fonctionne pas avec le select.
    Il me semble que les IPC System V ne renvoient pas des fd, mais des identifiants - qui ne sont pas partagés avec les processus fils. Je ne suis pas sûr à 100% de ça (sauf en ce qui concerne la partie "pas partagé" )

    Pour récupérer une mq ouverte dans un processus père, il faut refaire un msgctl() avec la clef spécifiée dans le père.

    Sinon, man 7 mq_overview

    Une MQ ouverte avec mq_open pointe bien sur un fd, lui, et ce fd est hérité par tous les processus fils.

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    #include <fcntl.h>
    #include <sys/stat.h>
    #include <mqueue.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    // link avec -lrt
     
    int main()
    {
      char *buffer;
      mqd_t mq;
      pid_t pid;
      int r;
      struct mq_attr attr;
     
      mq = mq_open("/ma_message_queue", O_RDWR|O_CREAT);
      if (mq == (mqd_t)(-1)) { perror("mq_open"); exit(-1); }
      memset(&attr, 0, sizeof(attr));
      mq_getattr(mq, &attr);
      pid = fork();
      if (pid < 0)
      {
        mq_close(mq);
        perror("fork");
        exit(-2);
      }
      else if (pid == 0)
      {
        // child process
        mq_send(mq, "test", 5, 0);
        exit(0);
      }
      else
      {
        waitpid(pid,NULL,0);
     	buffer = malloc(attr.mq_msgsize);
        r = mq_receive(mq, buffer, attr.mq_msgsize, NULL);
        if (r > 0)
        {
        	printf("message = %s\n", buffer);
        }
        else if (r == 0)
        {
        	printf("no message received\n");
        }
        else
        {
        	perror("mq_receive");
        }
        free(buffer);
        mq_close(mq);
        return 0;
      }
    }
    C'est écrit en C, mais on peut écrire de même en C++ (en beaucoup plus court, en fait).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

Discussions similaires

  1. [SQL] Contrôle "Select" et liste des options
    Par Cantalou dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/12/2006, 20h31
  2. Réponses: 2
    Dernier message: 24/11/2006, 10h24
  3. limite nre de selection dans liste deroulante
    Par logone dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/06/2006, 12h31
  4. Fonction qui cache en fonction d'une selection de liste
    Par AlphonseBrown dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 20/03/2006, 19h53
  5. Liste FIFO...
    Par blaiseac dans le forum Langage
    Réponses: 1
    Dernier message: 27/07/2005, 15h18

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