CreateFileMapping () – parametri de dimensiune
On februarie 10, 2021 by adminVreau să fac un program, care va pune o frază în memoria partajată, astfel încât un alt program va primi acest masaj. Am făcut asta, dar nu înțeleg parametrii 4 și 5 ai CreateFileMapping ().
În programul meu scriu 256 (al 5-lea parametru), dar când l-am schimbat la 1, programul a funcționat în continuare. Am crezut că ar trebui să se blocheze, deoarece presupun că dwMaximumSizeLow este cea mai mică dimensiune. Când pun ceva valoare în al 4-lea argument programul se blochează. Am crezut că această valoare ar trebui să fie mai mare a cincea, dar m-am înșelat.
Codul meu:
#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; }
Ați putea explica cum a patra și parametrii 5 ai funcției CreateFileMapping ()?
Comentarii
- Ne cereți să găsim Microsoft ' documentația acestei funcții pentru dvs.? (acest lucru este ușor pentru Google) Sau o explicație a ceea ce înseamnă anumite părți ale documentației? (ați putea include ghilimele părților exacte pe care nu le-ați putea ' nu înțelege? Aș putea ghici, dar ' probabil că ați greșit) De asemenea, nu ' nu înțelegeți modul în care acest fragment de cod este relevant pentru întrebarea dvs. dacă ' vă întrebați doar despre cum funcționează o singură funcție.
- Întreb despre parametrii 4 și 5 ai CreateFileMapping (), deoarece nu ' nu înțeleg cum funcționează. Din documentație, am crezut că dwMaximumSizeHigh este cea mai mare dimensiune a datelor din memoria partajată și dwMaximumSizeLow este cea mai mică dimensiune a datelor. Așa că am vrut să verific cum funcționează și am schimbat valoarea în parametrii 5 pe 1 program încă funcționat. Și nu ' nu știu de ce, pentru că așa este cel mai mic program care ar trebui să se blocheze.
Răspuns
Documentația explică foarte bine parametrii 4 și 5, dwMaximumSizeHigh
și dwMaximumSizeLow
. Cu toate acestea, acestea nu sunt cea mai mare și cea mai mică dimensiune posibilă a datelor, așa cum vă exprimați. Acestea sunt de ordinul înalt și partea de jos a aceleiași, fiecare fiind o parte de 32 de biți din dimensiunea de 64 de biți:
+--------+--------+--------+--------+--------+--------+--------+--------+ ! dwMaximumSizeHigh ! dwMaximumSizeLow ! +--------+--------+--------+--------+--------+--------+--------+--------+
Deci, dacă puneți 256 în ambele valori, memoria partajată va fi de 256 * 4294967295 + 256 = 1 099 511 627 776 octeți! Va fi de 1099 GB. Sigur aveți capacitatea pentru asta?
De ce nu se blochează dacă dimensiunea memoriei partajate este prea mic?
Când reduceți dimensiunea la 1 și scrieți mai mulți octeți în memoria partajată, puteți deteriora memoria. S-ar putea să rămână neobservat.
Nu se blochează, cu siguranță deoarece segfaults-urile sunt detectate prin intermediul sistemului de paginare, iar o pagină tipică de pe Windows este 4Kb. Mesajul dvs. de exemplu este prea mic pentru ca sistemul de paginare să observe că adresa solicitată merge în afara limitelor.
Comentarii
- Documentația Microsoft nu este clară pentru mine, în timp ce acest răspuns șterge ce sunt ordinele superioare și cele inferioare.
Lasă un răspuns