저는 C와 Linux를 처음 접했습니다. 함수 사용법에 대한 질문입니다 mmap
. 함수 프로토타입은 mmap
다음과 같습니다.
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
다음과 같은 코드가 표시됩니다.
char *srcp = mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);
이는 PROT_READ
가상 페이지를 읽을 수만 있다는 것을 의미합니다. MAP_PRIVATE
개인 쓰기 중 복사 개체임을 나타냅니다 . 기록 중 복사 기술은 두 프로세스가 동일한 개체를 사용하고 프로세스 A가 개체를 수정하는 경우 이러한 변경 사항은 프로세스 A에만 속하고 프로세스 B에는 표시되지 않는 것과 같습니다. 따라서 MAP_PRIVATE
사용자가 무언가를 쓸 수 있도록 허용하지만 PROT_READ
읽기 전용으로 표시하면 읽을 수만 있으므로 COW를 사용할 필요가 없습니다(COW를 사용하려면 먼저 뭔가를 쓸 수 있어야 하며 COW는 변경 사항을 볼 수만 있게 만듭니다). 귀하의 프로세스에 따라) 서로 모순되지 않습니까?
답변1
호출되면 mmap
호출자는 공유( MAP_SHARED
) 또는 개인( ) 매핑 MAP_PRIVATE
중에서 선택 해야 합니다. 쓰기 중 복사를 사용하는 것은 구현 세부 사항과 비교됩니다.POSIX 정의mmap
.
매핑 유형(공유 또는 개인)에 따라 쓰기 시 발생하는 상황만 결정됩니다. 따라서 의 경우에는 PROT_READ
중요하지 않으며 쓰기 중 복사를 사용하는 것도 중요하지 않습니다. 지원 파일에 대한 모든 변경 사항은 비공개 매핑을 사용하더라도 결국 프로세스 매핑에 표시됩니다. 이론적으로 이 동작은 다음과 같이 변경될 수 있습니다.
매핑 업데이트는 동일한 파일을 매핑하는 다른 프로세스에 표시되지 않으며 기본 파일로 전달되지 않습니다. 호출 후 파일에 대한 변경 사항이
mmap()
매핑된 영역에 표시되는지 여부는 지정되지 않습니다.
또한 프로세스는 다음을 사용하여 메모리 보호를 변경할 수 있습니다.mprotect
, 기본 파일에 쓸 수 있다고 가정합니다. 매핑 유형은 변경할 수 없지만 보호는 변경할 수 있으므로 프로세스는 파일을 읽기 전용으로 매핑한 다음 읽기-쓰기로 변경할 수 있습니다(파일 자체가 읽기-쓰기로 열린 경우 쓰기 중 복사가 됩니다). 중요한.
(감사해요사용자 414777이 답변의 이전 버전에서 일부 오류를 수정하는 데 사용됩니다. 남아있는 오류는 모두 내 것입니다. )