Bonjour,
Je suis bloqué par un problème. Je travaille sous linux. J'ai 2 processus (au sens de 2 exécutables (pas de rapport de filiation comme pour les
threads)).
Le premier processus (A) produit des données sous forme de structure.
Le second processus (B) doit lire les données produites par A de temps à autre (A et B sont asynchrones). Il existe plusieurs moyens de faire
communiquer des processus entre eux, et parmi ceux là, la mémoire partagée me semble être l'idéal (contrainte temps réel et la mémoire partagée est ce
qu'il y a de plus rapide pour faire transiter les données).
J'ai lu énormément de documentation sur internet, mais les exemples concrets sont rares. Les 2 programmes que j'essaie de construire ne fonctionnent pas
et j'aurais aimé un coup de main pour m'en sortir...
Voici le source de mes programmes.
Programme A
Alors pour commencer, ce programme est correctement compilé (avec gcc A.cpp -o A) SI je ne mets pas getchar()... Sinon, j'ai une vilaine erreur que je
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 // code source du processus A #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #define CLEF 12345 // je définis une clef au hasard int main() { // Je crée une structure quelconque qui comporte un entier et un double. typedef struct { int a; double b; }structure_partagee; // J'instancie une structure "structure_partagee" et je l'appelle data. structure_partagee data; int mem_ID; // identificateur du segment de mémoire partagée associé à CLEF void* ptr_mem_partagee; // adresse d'attachement du segment de mémoire partagée mem_ID = shmget(CLEF, sizeof(data), 0666 | IPC_CREAT); // je crée un nouveau segment mémoire de taille "taille de ma structure data" octets, avec des droits d'écriture et de lecture ptr_mem_partagee = shmat(mem_ID, NULL, 0); // J'attache le segment de mémoire partagée identifié par mem_ID au segment de données du processus A dans une zone libre déterminée par le Système d'exploitation // J'alloue des valeurs aux variables de ma structure data.a = 3; data.b = 2.5666; // et j'attends que le programme B vienne lire ces valeurs getchar(); // Lorsqu'une touche est frappée, je détruis le segment (le segment n'est pas détruit tant qu'au moins un processus est lié au segment) shmdt(ptr_mem_partagee); // je quitte le programme return 0; }
ne comprends pas:
Maintenant le programme B:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 /tmp/ccwmOC2V.o:(.eh_frame+0x11): référence indéfinie vers « __gxx_personality_v0 » collect2: ld returned 1 exit status
Alors lui il ne compile forcemment pas puisqu'il y a des ? quand je fais le shmget...
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 // code source du processus B #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <iostream> #define CLEF 12345 // je définis la même clef que celle du processus A int main() { // je déclare des variables aptes à recevoir les variables de la structure "structure_partagee" définie dans le processus A int var1; double var2; int mem_ID; // identificateur du segment de mémoire partagée associé à CLEF void* ptr_mem_partagee; // adresse d'attachement du segment de mémoire partagée // ALORS LA JE SUIS PERDU... mem_ID = shmget(CLEF, ?, ?); // Je suis sensé cherché le segment mémoire associé à CLEF et récupérer l'identificateur de ce segment mémoire... ptr_mem_partagee = shmat(mem_ID, NULL, 0); // J'attache le segment de mémoire partagée identifié par mem_ID au segment de données du processus B dans une zone libre déterminée par le Système d'exploitation var1 = data.a; var2 = data.b; // j'affiche le contenu des variables, ce qui est censé me montrer que mon programme à fonctionner... cout << "data.a = " << var1 << endl; cout << "data.b = " << var2 << endl; // Je détruis le segment (le segment n'est pas détruit tant qu'au moins un processus est lié au segment) shmdt(ptr_mem_partagee); // je me mets en attente getchar(); // je quitte le programme return 0; }
Est ce que je m'y prends de la bonne façon (ça m'étonnerait lol), et si ce n'est pas le cas, est ce que quelqu'un peut m'aider ?
Merci d'avance...
Partager