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++

  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 394
    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 394
    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 394
    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 394
    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!

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    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 394
    Par défaut
    Typiquement, essaie de faire ce que tu ferais si tu voulais enregistrer un fichier (bref, un truc où il n'y a pas de pointeurs du tout).

    On peut faire quand même des trucs pas mal avec un tableau: Par exemple, voici une liste chaînée sans pointeur, et une fonction qui la parcoure:
    Code C : 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
    #include <stddef.h>
    #include <stdio.h>
    #define TAILLE_MAX 10000
    #define INDEX_INVALIDE ((size_t)(ssize_t)(-1))
     
    struct chainon
    {
    	int toto;
    	int tata;
    	size_t ixSuivant; /*Index de l'élément suivant dans le tableau*/
    };
     
    struct chainon * CreerListeEnShm()
    {
    	struct chainon * pTableau;
    	tableau = shm_trucmachinchose(TAILLE_MAX * sizeof(struct chainon));
    	return pTableau;
    }
     
    void AfficherListe(
    	struct chainon const *pcTableau, /*[in] Liste à afficher*/
    	size_t ixPremier                /*[in] Index du premier élément dans le tableau*/
    	)
    {
    	size_t ixCourant;
    	for(ixCourant = ixPremier; ixCourant!=INDEX_INVALIDE ; ixPremier = pcTableau[ixCourant].ixSuivant;
    	{
    		printf("%d %d\n", pcTableau[ixCourant].toto, pcTableau[ixCourant].tata);
    	}
    }
    Note: Je n'ai pas testé, je n'ai même pas essayé de compiler. Mais c'est l'idée générale.
    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.

  8. #8
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 50
    Par défaut
    Mais pour le coup, je vois pas comment le fait de faire une gestion sans pointeur permet de contourner le problème de localisation des informations dans la mémoire a la suite de shmat. Par ce que même si on n'utilise pas de pointeurs, la position dans la mémoire ne sera pas la même quand je passerais dans un autre processus (en récupérant le pointeur via shmat).

    Sinon, le fait d'initialiser une liste chainer pour pouvoir récupérer toutes les trames, c'est une idée brillante! Mais au final, je n'ai besoin de passer qu'une seul liste (std::list) entre mes processus (Que j'avais encapsuler dans une structure, je sais même plus pourquoi ^^).

    Je vois pas comment regler ce probleme de localisation dans la memoire.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    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 394
    Par défaut
    Je viens de te montrer comment on fait une liste chaînée sans pointeur: Tout est relatif au début de la zone mémoire partagée.

    Tu peux appliquer cela à n'importe quoi.
    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.

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