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
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.