2013-10-05 8 views

答えて

5

共有するすべてのデータは、共有セグメントにある必要があります。これは、ポインタと文字列の両方が共用メモリ内になければならないことを意味する。

ポインタを含むものを共有するのは面倒な作業です。これは、mmapが所与のマッピングが必要なアドレスに終わることを保証しないためです。

2つの方法でこれを行うこともできます。まず、あなたはmmapであなたの運を試すことができ、動的リンカーがあなたの好みのアドレスに何かをロードしないことを願っています。

第2の方法は、相対ポインタを使用することです。ポインタの内部では、文字列へのポインタを格納する代わりに、ポインタのアドレスと文字列のアドレスの差を格納します。そのような:あなたが他のプロセスからの文字列にアクセスしたいときは、逆の操作を行う

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; 

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

それは少し面倒ですが、それは何のmmapリターンに関係なく動作します。

関連する問題