Memoria condivisa SEGV
-
28-10-2019 - |
Domanda
Ho provato a usare Boost e ho avuto un SEGV dopo 3000 allocazioni di oggetti di dimensioni 24, ora ho iniziato a usare sys/ipc.h e sys/shm.h, alloco 25 byte MIO (se lo capisco correttamente)
Sembra anche funzionare correttamente sul mio Linux Box IPCS -M mostrerà il segmento allocato
0x000081bc 917516 testUser 644 25000000 0
syscctl -p stamperà
kernel.shmmax = 25500000
Per qualche motivo funziona fino a quando il programma non raggiunge "43406 x 24 byte" che è il posto che sarà segv. Sarei felice di avere alcuni suggerimenti in cui si trova il mio problema. Si prega di notare anche se questo è il modo sbagliato per allocare e utilizzare la memoria condivisa con gli oggetti.
#define MAXMYMEM 25000000
int sharedMemId;
x *p_sharedMemory;
x *p_other;
sharedMemId = shmget(2232, MAXMYMEM, IPC_CREAT | 0644);
if(sharedMemId >= 0){
p_sharedMemory = (x*) shmat( sharedMemId, 0 , 0);
if(p_sharedMemory != ( x *)-1) {
cout << sizeof(x) << endl;
for(unsigned int i = 0 ; i < 1000000;i++ ){
(p_sharedMemory + (sizeof(x) * i))->setTest(i);
}
Soluzione
(p_sharedMemory + (sizeof(x) * i))->setTest(i);
Perché stai usando sizeof(x)
qui? Aggiungendo uno a un puntatore che punta a una X indicherà la prossima X, non il byte successivo. Sospetto che questo sia il tuo problema.
modificare (p_sharedMemory + (sizeof(x) * i))->setTest(i);
a
++p_sharedMemory;
p_sharedMemory->setTest(i);