귀하의 시스템에 Linux가 실행되고 있다고 가정합니다. intro(2)을 반드시 읽으십시오.
우리는 mmap(2) 파일 크기보다 우리가 아니라 페이지 크기의 정확한 배수 만 파일 (일반적으로 4KB이다, 아마 1Mbytes은 PAGESIZE
와 sysconf(3) 참조) 할 수 있습니다 경우 때문에 메모리 매핑 될 수 있습니다. 그럴 경우 메모리 매핑 파일은별로 유용하지 않습니다. 또한 mmap
-ed 파일의 크기는 시간에 따라 다를 수 있습니다 (다른 프로세스 write(2) - 첨부 및 추가, ftruncate(2) 등의 호출 ...). 따라서 kernel은 해당 파일을 필요로하거나 적용하지 않는 것이 좋습니다. 변하지 않는다.
신중
mmap(2)의 문서를 읽고, 그것을 말한다 :
파일은 페이지 크기의 배수에 매핑됩니다. 페이지 크기의 배수가 아닌 인 파일의 경우 이 매핑되면 나머지 메모리는 0으로 설정되고 해당 영역에 대한 쓰기는 파일에 기록되지 않습니다.
실패 할 수
및 mmap
(물론 커널이 어떤 당신이 상상하는 것보다 아마도 더 많은 검사를하고있다, 그래서), 그래서 당신의 코드가를 확인해야합니다, 예를 들어, 과에 따라 :
if ((void*)addr == MAP_FAILED)
{ perror("mmap"); exit(EXIT_FAILURE); };
BTW, 당신의 문제는 (다른 운영 체제가 memory mapped files를 제공하지 않을 수 있습니다, 또는 그들에 다른 제약을 둘 수 있었다) C++에만있는 것이 아니라 POSIX 또는 리눅스 고유의 것입니다.
메모리 매핑은 매우 일반적입니다. mmap
및 execve(2) 시간에 사용됩니다. 중 일부는 process이며, using/proc/
(proc(5) 참조)과 cat /proc/self/maps
및 cat /proc/$$/maps
(터미널에서 시도)을 이해할 수 있습니다. 그리고 mmap
이 매우 자주 사용됩니다 : malloc(3) 및 operator new
, dlopen(3), ld-linux(8) 동적 링크 된 공유 라이브러리.
Linux 또는 POSIX 프로그래밍에 대한 책 (예 : Advanced Linux Programming, 자유롭게 다운로드 할 수있는 것 또는 최신 버전)과 Operating Systems: Three Easy Pieces도 읽어보십시오.
태그를 편집하십시오. 'c'와'C++ '모두 오도 된 것입니다 – coderredoc
왜 그래야합니까? – Stargateur
@coderredoc mmap()은 c와 C++에서 동일하게 호출 할 수 있습니다. –