0

を使用して共有メモリのブロックが割り当てられCreateFileMapping()、そのハンドルが与えられます。一部のデータは次を使用して書き込まれましたMapViewOfFile()-- 「ソース」と呼びます

ここで、共有メモリを多くの小さなブロックに分割し、それらへのハンドルを取得したいと考えています。
再度呼び出しずにCreateFileMapping()「ソース」からコピーする方法はありますか?

OpenFileMapping()適切なオフセットでMapViewOfFile()動作しますが、問題は、呼び出したプロセスがOpenFileMapping()他のプロセスによって「ソース」に書き込まれたデータにアクセスできるようになり、間違ったオフセットを使用して破損する可能性があることです。

簡単に言えば、私は次のようなものを探していますOpenFileMapping(String name, UINT **offset**, ...)


最後の文は誤解を招くものでした。

私が本当にやろうとしていることは、次のようなものです。

<Host process>
HANDLE hShm = CreateFileMapping(INVALID_HANDLE_VALUE, ..., "shm");
void* pShm = MapViewOfFile(hShm);
UINT numShms = *(UINT*)pShm;   // first 4 bytes stores number of shared memory blocks
HANDLE *hShmSplit = new HANDLE[numShms];    
for(size_t i=0; i<numShms; i++) {
   TCHAR shmName[32];
   wsprintf(shmName, "shm%d", i);
   // suppose offset is set
   pShm+=offset;
   hShmSplit[i] = *CreateFileMappingFromExistingMapping*(pShm, shmName);
}
CloseHandle(hShm);   // no longer used

<Client process>
TCHAR* shmName="shm1";
HANDLE hShm = OpenFileMapping(shmName);
LPVOID p = MapViewOfFile(hShm);
// use shared memory 
// Now the client process has access to shm1 but not to shm2, shm3, or other shm_x's.
4

1 に答える 1

0

共有メモリは、同じ物理メモリ ページを複数のプロセスの仮想アドレス空間にマッピングすることによって機能します。プロセスがメモリ ページにアクセスできるようになると、ページ全体にアクセスできるようになります。メモリ ページの長さは 4KB です (Itanium にかかわらず)。

したがって、マップされたファイルを断片に分割できる場合、断片はページ境界から開始し、サイズが 4KB の正確な倍数である必要があります。だから、それはそれほど役に立たないでしょう。

異なるクライアント プロセスと異なるビットのメモリを安全に共有したい場合は、それぞれに個別のマッピングを使用する必要があります。

于 2012-07-17T13:37:46.960 に答える