파일 매핑 개체 만들기

파일을 매핑하는 첫 번째 단계는 CreateFile 함수를 호출하여 파일을 여는 것입니다. 다른 프로세스가 매핑된 파일의 부분에 쓸 수 없도록 하려면 전용 액세스 권한으로 파일을 열어야 합니다. 또한 프로세스에 파일 매핑 개체가 더 이상 필요하지 않을 때까지 파일 핸들이 열려 있어야 합니다. 단독 액세스를 얻는 쉬운 방법은 CreateFilefdwShareMode 매개 변수에 0을 지정하는 것입니다. CreateFile에서 반환된 핸들은 CreateFileMapping 함수에서 파일 매핑 개체를 만드는 데 사용됩니다.

CreateFileMapping 함수는 파일 매핑 개체에 대한 핸들을 반환합니다. 이 핸들은 공유 메모리에 액세스할 수 있도록 파일 보기를 만들 때 사용됩니다. CreateFileMapping을 호출할 때 개체 이름, 파일에서 매핑할 바이트 수 및 매핑된 메모리에 대한 읽기/쓰기 권한을 지정합니다. CreateFileMapping을 호출하는 첫 번째 프로세스는 파일 매핑 개체를 만듭니다. 기존 개체에 대해 CreateFileMapping 을 호출하는 프로세스는 기존 개체에 대한 핸들을 받습니다. GetLastError 함수를 호출하여 CreateFileMapping 호출이 파일 매핑 개체를 만들거나 열었는지 여부를 알 수 있습니다. GetLastError 는 만들기 프로세스에 NO_ERROR 반환하고 후속 프로세스에 ERROR_ALREADY_EXISTS .

CreateFile 함수가 파일을 열 때 액세스 플래그가 지정된 것과 충돌하면 CreateFileMapping 함수가 실패합니다. 예를 들어 파일을 읽고 쓰려면 다음을 수행합니다.

  • createFilefdwAccess 매개 변수에 GENERIC_READ 및 GENERIC_WRITE 값을 지정합니다.
  • CreateFileMappingfdwProtect 매개 변수에 PAGE_READWRITE 값을 지정합니다.

파일 매핑 개체를 만들면 실제 메모리를 커밋하지 않고 예약만 합니다.

파일 매핑 크기

파일 매핑 개체의 크기는 매핑되는 파일의 크기와는 별개입니다. 그러나 파일 매핑 개체가 파일보다 크면 CreateFileMapping 이 반환되기 전에 시스템이 파일을 확장합니다. 파일 매핑 개체가 파일보다 작은 경우 시스템은 파일에서 지정된 바이트 수만 매핑합니다.

CreateFileMappingdwMaximumSizeHighdwMaximumSizeLow 매개 변수를 사용하면 파일에서 매핑할 바이트 수를 지정할 수 있습니다.

  • 파일 크기를 변경하지 않으려면(예: 읽기 전용 파일을 매핑할 때) CreateFileMapping 을 호출하고 dwMaximumSizeHighdwMaximumSizeLow 둘 다에 대해 0을 지정합니다. 이렇게 하면 파일과 정확히 동일한 크기의 파일 매핑 개체가 만들어집니다. 그렇지 않으면 파일 매핑 개체의 크기가 정적이므로 완성된 파일의 크기를 계산하거나 예측해야 합니다. 만든 후에는 크기를 늘리거나 줄일 수 없습니다. 이러한 방식으로 길이가 0인 파일을 매핑하려고 하면 오류 코드가 ERROR_FILE_INVALID 실패합니다. 프로그램은 길이가 0인 파일을 테스트하고 해당 파일을 거부해야 합니다.

  • 명명된 파일에서 지원되는 파일 매핑 개체의 크기는 디스크 공간으로 제한됩니다. 파일 보기의 크기는 예약되지 않은 가상 메모리의 가장 큰 연속 블록으로 제한됩니다. 이 값은 프로세스에서 이미 예약한 가상 메모리를 뺀 최대 2GB입니다.

선택한 파일 매핑 개체의 크기는 메모리 매핑을 사용하여 "볼 수 있는" 파일의 범위를 제어합니다. 크기가 500Kb인 파일 매핑 개체를 만드는 경우 파일 크기에 관계없이 파일의 처음 500Kb에만 액세스할 수 있습니다. 더 큰 파일 매핑 개체를 만드는 데 시스템 리소스 비용이 들지 않으므로 전체 파일을 볼 필요가 없더라도 파일 크기인 파일 매핑 개체를 만듭니다(CreateFileMappingdwMaximumSizeHighdwMaximumSizeLow 매개 변수를 모두 0으로 설정). 시스템 리소스의 비용은 보기를 만들고 액세스하는 데 발생합니다.

파일의 시작 부분에서 시작되지 않는 파일의 일부를 볼 수 있습니다. 자세한 내용은 파일 내에서 보기 만들기를 참조하세요.

파일 뷰 만들기

파일 내에서 보기 만들기