2013-10-05 14 views

Antwort

5

Alle Daten, die Sie teilen möchten, müssen sich im gemeinsamen Segment befinden. Dies bedeutet, dass sich sowohl die Zeiger als auch die Zeichenfolgen im gemeinsamen Speicher befinden müssen.

Das Teilen von etwas, das Zeiger enthält, kann umständlich sein. Dies liegt daran, dass mmap nicht garantiert, dass eine gegebene Zuordnung in der erforderlichen Adresse endet.

Sie können dies immer noch auf zwei Arten tun. Zuerst können Sie Ihr Glück mit mmap versuchen und hoffen, dass der dynamische Linker etwas an Ihrer bevorzugten Adresse nicht lädt.

Die zweite Methode besteht darin, relative Zeiger zu verwenden. Anstatt einen Zeiger auf eine Zeichenfolge zu speichern, speichern Sie in einem Zeiger den Unterschied zwischen der Adresse des Zeigers und der Adresse der Zeichenfolge. Wie so:

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; 

Wenn Sie die Zeichenfolge aus dem anderen Prozess zugreifen möchten, können Sie tun das Gegenteil:

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

Es ist ein wenig umständlich, aber es funktioniert unabhängig davon, welche Mmap kehrt zurück.

Verwandte Themen