CreateFileMapping () – parameters van grootte
Geplaatst op februari 10, 2021 door adminIk wil een programma maken dat een zin in het gedeelde geheugen plaatst, zodat een ander programma deze massage zal ontvangen. Ik heb dat gemaakt, maar ik begrijp de 4e en 5e parameters van CreateFileMapping () niet.
In mijn programma schrijf ik 256 (5e parameter), maar toen ik dit veranderde in 1, werkte het programma nog steeds. Ik dacht dat het zou moeten crashen, omdat ik aanneem dat dwMaximumSizeLow de laagste grootte is. Als ik een waarde toevoeg aan het 4e argument, crasht het programma. Ik dacht dat deze waarde hoger zou moeten zijn dan de 5e, maar ik had het mis.
Mijn code:
#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; }
Kunt u uitleggen hoe de 4e en 5e parameters van CreateFileMapping () werken?
Reacties
- Vraagt u ons Microsoft ' s documentatie van deze functie voor u? (dit is gemakkelijk te Google) Of een uitleg van wat bepaalde delen van de documentatie betekenen? (kun je citaten opnemen van de exacte delen die je niet ' niet kon begrijpen? Ik zou het kunnen raden, maar ik ' zou waarschijnlijk verkeerd raden) ' begrijp ook niet hoe dit codefragment relevant is voor uw vraag als u ' alleen vraagt hoe een enkele functie werkt.
- Ik vraag naar de 4e en 5e parameter van CreateFileMapping (), omdat ik ' niet begrijp hoe het werkt. Uit documentatie dacht ik dat dwMaximumSizeHigh de grootste gegevensgrootte in het gedeelde geheugen is en dwMaximumSizeLow de kleinste gegevensgrootte. Dus ik wilde kijken hoe het werkt en ik veranderde de waarde in 5e parameters op 1 programma werkte nog steeds. En ik weet niet ' waarom, want het is dus het programma met de laagste grootte dat zou moeten crashen.
Antwoord
De documentatie legt de 4e en 5e parameter heel goed uit, dwMaximumSizeHigh
en dwMaximumSizeLow
. Ze zijn echter niet de hoogste en de laagst mogelijke omvang van de gegevens, zoals u verwacht. Dit zijn de hoge en lage orde van hetzelfde, elk een 32-bits deel van de 64-bits grootte:
+--------+--------+--------+--------+--------+--------+--------+--------+ ! dwMaximumSizeHigh ! dwMaximumSizeLow ! +--------+--------+--------+--------+--------+--------+--------+--------+
Dus als u 256 in beide waarden is uw gedeelde geheugen 256 * 4294967295 + 256 = 1099511627776 bytes! Dat wordt 1099 GB. Weet u zeker dat u daarvoor de capaciteit heeft?
Waarom crasht het niet als de grootte van het gedeelde geheugen is too small?
Wanneer u de grootte verkleint tot 1 en meer bytes naar het gedeelde geheugen schrijft, beschadigt u mogelijk het geheugen. Het kan onopgemerkt blijven.
Het crasht niet, zeker omdat de segfaults worden gedetecteerd via het pagingsysteem, en een typische pagina op Windows is 4Kb. Uw voorbeeldbericht is te klein voor het pagingsysteem om te merken dat het gevraagde adres wordt verzonden out of bounds.
Opmerkingen
- De Microsoft-documentatie is mij niet duidelijk, terwijl dit antwoord duidelijk maakt wat high-order en low-order zijn.
Geef een reactie