CreateFileMapping ()-매개 변수
On 2월 10, 2021 by admin다른 프로그램이이 마사지를받을 수 있도록 공유 메모리에 문장을 넣는 프로그램을 만들고 싶습니다. 나는 그것을 만들었지 만 CreateFileMapping ()의 4 번째와 5 번째 매개 변수를 이해하지 못한다.
내 프로그램에서 256 (5 번째 매개 변수)을 작성했지만 이것을 1로 변경해도 프로그램은 여전히 작동했습니다. dwMaximumSizeLow가 가장 낮은 크기라고 가정하기 때문에 충돌해야한다고 생각했습니다. 네 번째 인수에 값을 입력하면 프로그램이 충돌합니다. 이 값이 5 번째보다 높아야한다고 생각했지만 잘못되었습니다.
내 코드 :
#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; }
4 번째 CreateFileMapping ()의 다섯 번째 매개 변수가 작동합니까?
댓글
- Microsoft를 찾아달라고 요청하십니까 '이 기능에 대한 설명서가 있습니까? (이것은 Google에게 쉽습니다) 또는 문서의 특정 부분이 의미하는 바에 대한 설명? (이해할 수없는 ' 정확한 부분에 대한 인용문을 포함 할 수 있습니까? 추측 할 수는 있지만 ' 아마도 잘못 추측 할 것입니다.) 또한 ' 단일 함수의 작동 방식에 대해서만 질문하는 경우 '이 코드 스 니펫이 질문과 어떻게 관련되는지 이해하지 못합니다.
- CreateFileMapping ()의 4 번째 및 5 번째 매개 변수에 대해 묻습니다. 작동 방식을 ' 잘 이해하지 못하기 때문입니다. 문서에서 dwMaximumSizeHigh는 공유 메모리에서 가장 큰 데이터 크기이고 dwMaximumSizeLow는 가장 낮은 데이터 크기입니다. 그래서 나는 그것이 어떻게 작동하는지 확인하고 싶었고 1 프로그램에서 5 번째 매개 변수의 값을 변경했지만 여전히 작동했습니다. 그리고 나는 ' 이유를 알지 못합니다. 프로그램 크기가 가장 작기 때문에 충돌이 발생합니다.
답변
문서 는 4 번째 및 5 번째 매개 변수 인 dwMaximumSizeHigh
를 매우 잘 설명합니다. 및 dwMaximumSizeLow
. 그러나 예상대로 데이터의 가능한 최대 및 최소 크기는 아닙니다. 그것들은 각각 64 비트 크기의 32 비트 부분 인 높은 순서와 낮은 순서 부분입니다.
+--------+--------+--------+--------+--------+--------+--------+--------+ ! dwMaximumSizeHigh ! dwMaximumSizeLow ! +--------+--------+--------+--------+--------+--------+--------+--------+
256을 넣으면 이 두 값에서 공유 메모리는 256 * 4294967295 + 256 = 1099511627776 바이트입니다! 용량은 1099GB입니다. 용량이 확실합니까?
공유 메모리의 크기가 다음과 같은 경우 충돌하지 않는 이유는 무엇입니까? 너무 작음?
크기를 1로 줄이고 공유 메모리에 더 많은 바이트를 쓰면 메모리가 손상 될 수 있습니다. 눈에 띄지 않을 수 있습니다.
세그 폴트가 페이징 시스템을 통해 감지되고 Windows의 일반적인 페이지가 4Kb이기 때문에 충돌하지 않습니다. 페이징 시스템이 요청 된 주소가 전송된다는 것을 알기에는 예제 메시지가 너무 작습니다.
댓글
- 이 답변은 고차 및 저차가 무엇인지 명확하지만 Microsoft 문서는 저에게 명확하지 않습니다.
답글 남기기