Jeśli chcesz podzielić się czymś w rodzaju char **keys
tablicy między fork()
„d procesach używając shm_open
i mmap
mogę tylko trzymać wskaźnik do keys
do segmentu pamięci wspólnej, czy muszę skopiować wszystkie dane w keys
do segmentu pamięci wspólnej?Sharing Wskaźniki między wieloma Rozwidlonych Procesów
Odpowiedz
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.