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
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 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; }
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...
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); }
Merci d'avance a toutes les personnes qui prendront le temps de lire mon pave
ps: Desole pour les accents -> qwerty powa ^^
Partager