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);

        }
È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top