CreateFileMapping () – Parameter der Größe
On Februar 10, 2021 by adminIch möchte ein Programm erstellen, das einen Satz im gemeinsamen Speicher ablegt, damit ein anderes Programm diese Massage erhält. Ich habe das gemacht, aber ich verstehe den 4. und 5. Parameter von CreateFileMapping () nicht.
In meinem Programm schreibe ich 256 (5. Parameter), aber als ich dies auf 1 änderte, funktionierte das Programm immer noch. Ich dachte, es sollte abstürzen, weil ich davon ausgehe, dass dwMaximumSizeLow die niedrigste Größe ist. Wenn ich einen Wert in das 4. Argument setze, stürzt das Programm ab. Ich dachte, dieser Wert sollte am 5. höher sein, aber ich habe mich geirrt.
Mein 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; }
Können Sie erklären, wie der 4 .. und 5. Parameter von CreateFileMapping () funktionieren?
Kommentare
- Bitten Sie uns, Microsoft ' s Dokumentation dieser Funktion für Sie? (Dies ist für Google einfach.) Oder eine Erklärung, was bestimmte Teile der Dokumentation bedeuten? (Könnten Sie Anführungszeichen der genauen Teile einfügen, die Sie ' nicht verstehen könnten? Ich könnte raten, aber ich ' würde wahrscheinlich falsch raten) I. ' verstehe auch nicht, wie dieses Codefragment für Ihre Frage relevant ist, wenn Sie ' nur nach der Funktionsweise einer einzelnen Funktion fragen.
- Ich frage nach dem 4. und 5. Parameter von CreateFileMapping (), weil ich ' nicht verstehe, wie es funktioniert. Aus der Dokumentation ging hervor, dass dwMaximumSizeHigh die höchste Datengröße im gemeinsam genutzten Speicher und dwMaximumSizeLow die niedrigste Datengröße ist. Also wollte ich überprüfen, wie es funktioniert und ich habe den Wert in den 5. Parametern für 1 Programm geändert, das immer noch funktioniert. Und ich ' weiß nicht warum, weil es also das Programm mit der niedrigsten Größe ist, das abstürzen sollte.
Antwort
In der Dokumentation werden die 4. und 5. Parameter dwMaximumSizeHigh
sehr gut erläutert und dwMaximumSizeLow
. Sie sind jedoch nicht die höchste und die niedrigstmögliche Größe der Daten, wie Sie erwarten. Sie sind der Teil hoher und niedriger Ordnung derselben, wobei jeder Teil ein 32-Bit-Teil der 64-Bit-Größe ist:
+--------+--------+--------+--------+--------+--------+--------+--------+ ! dwMaximumSizeHigh ! dwMaximumSizeLow ! +--------+--------+--------+--------+--------+--------+--------+--------+
Wenn Sie also 256 eingeben In diesen beiden Werten beträgt Ihr gemeinsam genutzter Speicher 256 * 4294967295 + 256 = 1 099 511 627 776 Byte! Das sind 1099 GB. Sind Sie sicher, dass Sie die Kapazität dafür haben?
Warum stürzt es nicht ab, wenn die Größe des gemeinsam genutzten Speichers ist? zu klein?
Wenn Sie die Größe auf 1 reduzieren und mehr Bytes in den gemeinsam genutzten Speicher schreiben, wird möglicherweise der Speicher beschädigt. Es könnte unbemerkt bleiben.
Es stürzt nicht ab, sicherlich, weil die Segfaults über das Paging-System erkannt werden und eine typische Seite unter Windows 4 KB groß ist. Ihre Beispielnachricht ist zu klein, als dass das Paging-System feststellen könnte, dass die angeforderte Adresse lautet außerhalb der Grenzen.
Kommentare
- Die Microsoft-Dokumentation ist mir nicht klar, während diese Antwort klar macht, was höher und niedrig ist.
Schreibe einen Kommentar