학습
파일 매핑 개체 만들기
파일을 매핑하는 첫 번째 단계는 CreateFile 함수를 호출하여 파일을 여는 것입니다. 다른 프로세스가 매핑된 파일의 부분에 쓸 수 없도록 하려면 전용 액세스 권한으로 파일을 열어야 합니다. 또한 프로세스에 파일 매핑 개체가 더 이상 필요하지 않을 때까지 파일 핸들이 열려 있어야 합니다. 단독 액세스를 얻는 쉬운 방법은 CreateFile의 fdwShareMode 매개 변수에 0을 지정하는 것입니다. CreateFile에서 반환된 핸들은 CreateFileMapping 함수에서 파일 매핑 개체를 만드는 데 사용됩니다.
CreateFileMapping 함수는 파일 매핑 개체에 대한 핸들을 반환합니다. 이 핸들은 공유 메모리에 액세스할 수 있도록 파일 보기를 만들 때 사용됩니다. CreateFileMapping을 호출할 때 개체 이름, 파일에서 매핑할 바이트 수 및 매핑된 메모리에 대한 읽기/쓰기 권한을 지정합니다. CreateFileMapping을 호출하는 첫 번째 프로세스는 파일 매핑 개체를 만듭니다. 기존 개체에 대해 CreateFileMapping 을 호출하는 프로세스는 기존 개체에 대한 핸들을 받습니다. GetLastError 함수를 호출하여 CreateFileMapping 호출이 파일 매핑 개체를 만들거나 열었는지 여부를 알 수 있습니다. GetLastError 는 만들기 프로세스에 NO_ERROR 반환하고 후속 프로세스에 ERROR_ALREADY_EXISTS .
CreateFile 함수가 파일을 열 때 액세스 플래그가 지정된 것과 충돌하면 CreateFileMapping 함수가 실패합니다. 예를 들어 파일을 읽고 쓰려면 다음을 수행합니다.
- createFile의fdwAccess 매개 변수에 GENERIC_READ 및 GENERIC_WRITE 값을 지정합니다.
- CreateFileMapping의 fdwProtect 매개 변수에 PAGE_READWRITE 값을 지정합니다.
파일 매핑 개체를 만들면 실제 메모리를 커밋하지 않고 예약만 합니다.
파일 매핑 개체의 크기는 매핑되는 파일의 크기와는 별개입니다. 그러나 파일 매핑 개체가 파일보다 크면 CreateFileMapping 이 반환되기 전에 시스템이 파일을 확장합니다. 파일 매핑 개체가 파일보다 작은 경우 시스템은 파일에서 지정된 바이트 수만 매핑합니다.
CreateFileMapping의 dwMaximumSizeHigh 및 dwMaximumSizeLow 매개 변수를 사용하면 파일에서 매핑할 바이트 수를 지정할 수 있습니다.
파일 크기를 변경하지 않으려면(예: 읽기 전용 파일을 매핑할 때) CreateFileMapping 을 호출하고 dwMaximumSizeHigh 및 dwMaximumSizeLow 둘 다에 대해 0을 지정합니다. 이렇게 하면 파일과 정확히 동일한 크기의 파일 매핑 개체가 만들어집니다. 그렇지 않으면 파일 매핑 개체의 크기가 정적이므로 완성된 파일의 크기를 계산하거나 예측해야 합니다. 만든 후에는 크기를 늘리거나 줄일 수 없습니다. 이러한 방식으로 길이가 0인 파일을 매핑하려고 하면 오류 코드가 ERROR_FILE_INVALID 실패합니다. 프로그램은 길이가 0인 파일을 테스트하고 해당 파일을 거부해야 합니다.
명명된 파일에서 지원되는 파일 매핑 개체의 크기는 디스크 공간으로 제한됩니다. 파일 보기의 크기는 예약되지 않은 가상 메모리의 가장 큰 연속 블록으로 제한됩니다. 이 값은 프로세스에서 이미 예약한 가상 메모리를 뺀 최대 2GB입니다.
선택한 파일 매핑 개체의 크기는 메모리 매핑을 사용하여 "볼 수 있는" 파일의 범위를 제어합니다. 크기가 500Kb인 파일 매핑 개체를 만드는 경우 파일 크기에 관계없이 파일의 처음 500Kb에만 액세스할 수 있습니다. 더 큰 파일 매핑 개체를 만드는 데 시스템 리소스 비용이 들지 않으므로 전체 파일을 볼 필요가 없더라도 파일 크기인 파일 매핑 개체를 만듭니다(CreateFileMapping의 dwMaximumSizeHigh 및 dwMaximumSizeLow 매개 변수를 모두 0으로 설정). 시스템 리소스의 비용은 보기를 만들고 액세스하는 데 발생합니다.
파일의 시작 부분에서 시작되지 않는 파일의 일부를 볼 수 있습니다. 자세한 내용은 파일 내에서 보기 만들기를 참조하세요.