CreateFileMapping () – parametry rozmiaru
On 10 lutego, 2021 by adminChcę zrobić program, który umieści jakieś zdanie w pamięci współdzielonej, aby inny program otrzymał ten komunikat. Zrobiłem to, ale nie rozumiem 4 i 5 parametrów CreateFileMapping ().
W moim programie piszę 256 (piąty parametr), ale kiedy zmieniłem to na 1, program nadal działał. Pomyślałem, że powinien się zawiesić, ponieważ zakładam, że dwMaximumSizeLow jest najmniejszym rozmiarem. Kiedy podam jakąś wartość w 4. argumencie program się zawiesza. Myślałem, że ta wartość powinna być wyższa przy piątej, ale się myliłem.
Mój kod:
#include <iostream> #include <Windows.h> const char name[256] = "Map1"; const char massage[256] = "Welcome in the world without rules"; int main() { using std::cout; using std::cin; using std::endl; HANDLE hMap; hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 256, (LPCTSTR)name); if (!hMap) { cout << "create error" << endl; return 1; } char * data = (char*) MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, NULL, NULL,NULL); if (!data) { cout << "mapview error" << endl; return 1; } if (!(CopyMemory(data, massage, sizeof(char) * 256)) ) { cout << "copy error" << endl; } cin.get(); UnmapViewOfFile(hMap); CloseHandle(hMap); return 0; }
Czy mógłbyś wyjaśnić, jak 4 i piąty parametr funkcji CreateFileMapping () działa?
Komentarze
- Czy prosisz nas o znalezienie firmy Microsoft ' dokumentacja dotycząca tej funkcji? (to jest łatwe dla Google) Albo wyjaśnienie, co oznaczają niektóre części dokumentacji? (czy mógłbyś zamieścić cudzysłowy dokładnie tych części, których nie ' rozumiesz? Mogę się domyślić, ale ' d prawdopodobnie zgadłem) nie ' nie rozumiem, w jaki sposób ten fragment kodu ma związek z Twoim pytaniem, jeśli ' pytasz tylko o to, jak działa pojedyncza funkcja.
- Pytam o czwarty i piąty parametr metody CreateFileMapping (), ponieważ nie ' nie rozumiem, jak to działa. Z dokumentacji pomyślałem, że dwMaximumSizeHigh to największy rozmiar danych w pamięci współdzielonej, a dwMaximumSizeLow to najmniejszy rozmiar danych. Chciałem więc sprawdzić jak to działa i zmieniłem wartość w 5 parametrach na 1 programie nadal działał. I nie ' nie wiem dlaczego, ponieważ jest to program o najmniejszym rozmiarze, który powinien się zawiesić.
Odpowiedź
dokumentacja bardzo dobrze objaśnia czwarty i piąty parametr, dwMaximumSizeHigh
i dwMaximumSizeLow
. Nie są one jednak największym i najmniejszym możliwym rozmiarem danych, jak to wyjaśnisz. Są to części tego samego rzędu najwyższego i najniższego rzędu, z których każda jest 32-bitową częścią rozmiaru 64-bitowego:
+--------+--------+--------+--------+--------+--------+--------+--------+ ! dwMaximumSizeHigh ! dwMaximumSizeLow ! +--------+--------+--------+--------+--------+--------+--------+--------+
Więc jeśli wstawisz 256 w obu tych wartościach pamięć współdzielona będzie wynosić 256 * 4294967295 + 256 = 1 099 511 627 776 bajtów! To „będzie 1099 GB. Czy na pewno masz odpowiednią pojemność?
Dlaczego nie ulega awarii, jeśli rozmiar pamięci współdzielonej wynosi zbyt mała?
Kiedy zmniejszysz rozmiar do 1 i zapiszesz więcej bajtów w pamięci współdzielonej, potencjalnie uszkodzisz pamięć. Może pozostać niezauważone.
Nie ulega awarii, z pewnością dlatego, że segfaulty są wykrywane przez system stronicowania, a typowa strona w systemie Windows ma rozmiar 4Kb. Twoja przykładowa wiadomość jest zbyt mała, aby system stronicowania mógł zauważyć, że żądany adres trafia poza granicami.
Komentarze
- Dokumentacja firmy Microsoft nie jest dla mnie jasna, podczas gdy ta odpowiedź wyjaśnia, co to jest najwyższe i najniższe zamówienie.
Dodaj komentarz