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

Threads & Processus C++ Discussion :

Probleme avec des SHM entre processus et thread.


Sujet :

Threads & Processus 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 Probleme avec des SHM entre processus et thread.
    Bonjour a tous!

    J'ai un problème avec des shm qui me font des misères. Je vous explique, et apres je vous montre du code.

    En gros, j'ai 2 programme, un nomme IPC, et l'autre nomme THREAD. Dans mon programme ipc, je declare ma SHM, je la fait pointer sur une struct que j'ai new auparavant, et je fait des push_back() dedans.
    Une fois la SHM declarer, je fork. Et dans le fils de ce fork, je fais un exec de mon THREAD. Juque la, ca va.

    Ensuite, dans mon programme THREAD, je lance plusieurs thread qui ont des taches specifiques. dans l'un de ses thread, je redeclare ma SHM avec la meme cle, je la fait pointe sur un pointeur de ma structure. Et c'est la que le bat blesse!

    Quand j'essaye de faire un malist.front() pour recuperer mes push back, ca me fait segfaulter mon programme (retour signal 11 sur mon wait). Je dois donc m'y prendre tres mal! Je vous donne le code (pas complet) que j'utilise pour faire tout ca:

    Voici mon IPC
    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
     
    typedef struct fifoprocess_s{
      list<string> fifo1;
    } fifo_p;
     
    int main()
    {
      key_t key = 10101010;
      int shmid;
      fifo_p *testlist = new fifo_p;
      int mode;
     
      if ((shmid = shmget(key, sizeof(fifo_p), 0666 | IPC_CREAT)) == -1)
        {
          cout << "shmget error" << endl;
          exit(1);
        }
     
      /** Ici, je suis pas sur de comment l'utiliser. au debut je faisais:
      **  testlist = reinterpret_cast<fifo_p*>(shmat(shmid, NULL, 0));
      **  Mais en faisant ca, je segfaultais au moment de faire mon pushback juste en dessous...
      **/
      shmat(shmid, (void*)testlist, 0);
      if ((char*)testlist == (char*)(-1))
        cout << "shmat error" << endl;
     
      testlist->fifo1.push_back("on va voir si ca marche");
     
     
     
      int rc, i;
      rc = fork();
      if (rc == 0)
        {
          cout << "\ndebut du fils" << endl;
          cout << testlist->fifo1.front() << endl;
          execv("/home/baradhur/test/thread/thread", NULL);
        }
      else
        {
           cout << "debut du pere" << endl;
           wait(&i);      
           cout << "fin du fils" << endl;
        }
      return 0;
    }
    Et voici mon THREAD simplifie:

    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
     
    typedef struct fifoprocess_s{
      list<string> fifo1;
    } fifo_p;
     
    void *PrintHello(void *threadid)
    {
      key_t key = 10101010;
      int shmid;
      fifo_p *inter = new fifo_p;
     
     
      if ((shmid = shmget(key, sizeof(fifo_p), 0666 | IPC_CREAT)) == -1)
        {
        perror("shmget");
        exit(1);
      }
      cout << "debut du thread1" << endl;
     
      /** Ici, Meme probleme que dans mon IPC, je ne suis pas sur de comment utiliser ce pointeur
      ** Faut il bosser sur le pointeur renvoyer par shmat, ou on peut bosser sur l'adresse memoire qu'on passe a shmat?
      ** Dans les 2 cas, ca segfault de toute facon lol
      **/
      shmat(shmid, (void*)inter, 0);
      cout << "test du passage entre process: " << endl;
     
      /** C'est sur cette ligne juste en dessous que ca segfault. 
       ** Surement par ce que j'utilise mal les shm...
      **/
      cout << inter->fifo1.front() << endl;
      inter->fifo1.pop_front();
      cout << "fin du thread 1" << endl;
     
      pthread_exit(NULL);
    }
     
    int main (int argc, char *argv[])
    {
      pthread_t thread1;
      pthread_t thread2;
      int rc, rd;
     
      cout << "In main: creating test thread 1" << endl;
      rc = pthread_create(&thread1, NULL, PrintHello, NULL);
      if (rc)
        {
          cerr << "ERROR; return code from pthread_create() is " << rc << endl;
          exit(-1);
        }
      pthread_join(thread1, NULL);
     
      cout << "test a l'execution" << endl;
      pthread_exit(NULL);
    }
    Si quelqu'un a l'habitude d'utiliser les SHM, et voit direct ou se situe mon probleme, je lui en serait extremement reconnaissant! Je dois surement avoir mal compris comment ca se passe...

    Merci d'avance a toutes les personnes qui prendront le temps de lire mon pave

    ps: Desole pour les accents -> qwerty powa ^^

  2. #2
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 50
    Par défaut
    J'ai repris mon code pour faire passer juste des char* via les shm,et ca marche. En recuperant le pointeur donne par shmat, et en faisant un strncpy dessus, j'arrive a le recuperer dans mon deuxieme programme.

    Faut il faire quelque chose en particulier pour que ca passe avec des objets de cpp?

    edit: je me demande si je devrais pas utiliser des named pipe plutot que des shm... Tout ce dont j'ai besoin, c'est d'une fifo inter-process au final!

  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
    Je crois que les templates des objets de la STL acceptent un paramètre allocator, qui devrait te permettre de faire un allocateur perso qui passe par ta shm. Sinon, ça alloue en-dehors...
    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 averti
    Inscrit en
    Octobre 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 50
    Par défaut
    Y'a pas moyen de faire passer simplement une structure, ou au moins une liste C++, dans une shm? Est ce que je dois utilise autre chose?

  5. #5
    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
    Rien qui contienne des pointeurs. Même des pointeurs vers la shm ne sont pas sûrs, car elle peut être mappée à deux adresses différentes dans les différents processus.

    Par contre, tu peux passer des tableaux de structures, avec des indexes ou des offsets...
    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.

  6. #6
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 50
    Par défaut
    Tu pourrais me donner un petit exemple rapide? Par ce que j'ai passe 2 jours a m'arracher les cheveux pour faire passer ma structure avec une pauvre liste dedans! J'ai essayer de copier la memoire, de mapper a une adresse precise, etc mais a chaque fois ca me faisait segfaulter...

    Ce serait vraiment cool!

Discussions similaires

  1. Probleme avec des structures
    Par lenectar dans le forum C
    Réponses: 17
    Dernier message: 30/12/2005, 09h53
  2. [FLASH MX] Probleme avec des liens.
    Par maxcmoi dans le forum Flash
    Réponses: 2
    Dernier message: 12/11/2005, 11h11
  3. Probleme avec des socket !
    Par Ptimath44 dans le forum Réseau
    Réponses: 11
    Dernier message: 31/10/2005, 18h11
  4. Probleme avec des pointeurs...
    Par barucca dans le forum C++
    Réponses: 5
    Dernier message: 23/08/2005, 21h05
  5. Problemes avec des cellules vides
    Par arsgunner dans le forum ASP
    Réponses: 7
    Dernier message: 14/06/2004, 08h42

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