2013-10-05 18 views
5

Se voglio condividere qualcosa come un char **keys matrice tra fork() 'd processi utilizzando shm_open e mmap posso solo bastone un puntatore a keys in un segmento di memoria condivisa o devo copiare tutti i dati in keys nel segmento di memoria condivisa?condivisione puntatori tra più processi a forcella

risposta

5

Tutti i dati che si desidera condividere devono essere nel segmento condiviso. Ciò significa che sia i puntatori che le stringhe devono essere nella memoria condivisa.

Condividere qualcosa che include i puntatori può essere ingombrante. Questo perché mmap non garantisce che una determinata mappatura finirà nell'indirizzo richiesto.

È ancora possibile farlo in due modi. Innanzitutto, puoi provare la tua fortuna con mmap e sperare che il linker dinamico non carichi qualcosa al tuo indirizzo preferito.

Il secondo metodo consiste nell'utilizzare i puntatori relativi. All'interno di un puntatore, invece di memorizzare un puntatore su una stringa, si memorizza la differenza tra l'indirizzo del puntatore e l'indirizzo della stringa. In questo modo:

char **keys= mmap(NULL, ...); 
char *keydata= (char*) keys + npointers * sizeof(char*); 
strcpy(keydata, firstring); 
keys[0]= (char*) (keydata - (char*) &keys[0]); 
keydata+= strlen(firststring)+1; 

Quando si desidera accedere alla stringa da l'altro processo, si fa il contrario:

char **keys= mmap(NULL, ...); 
char *str= (char*) (&keys[0]) + (ptrdiff_t) keys[0]; 

E 'un po' ingombrante ma funziona indipendentemente da ciò che i rendimenti mmap.

Problemi correlati