2013-10-05 7 views

Odpowiedz

5

Wszystkie dane, które chcesz udostępnić, muszą znajdować się we wspólnym segmencie. Oznacza to, że zarówno wskaźniki, jak i łańcuchy muszą znajdować się we wspólnej pamięci.

Udostępnianie czegoś zawierającego wskaźniki może być uciążliwe. Jest tak, ponieważ mmap nie gwarantuje, że dane mapowanie znajdzie się w wymaganym adresie.

Nadal można to zrobić na dwa sposoby. Po pierwsze, możesz spróbować szczęścia z mmap i mieć nadzieję, że linker dynamiczny nie załaduje czegoś pod preferowany adres.

Druga metoda polega na użyciu względnych wskaźników. Wewnątrz wskaźnika zamiast zapisywania wskaźnika na łańcuchu, przechowuje się różnicę między adresem wskaźnika a adresem łańcucha. Tak:

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; 

Kiedy chcesz uzyskać dostęp ciąg od innego procesu, zrobić odwrotnie:

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

To trochę kłopotliwe, ale działa niezależnie od deklaracji co mmap.

Powiązane problemy