mmap: 이전에 읽기 전용으로 매핑된 파일에 쓰는 다른 프로세스의 영향

mmap: 이전에 읽기 전용으로 매핑된 파일에 쓰는 다른 프로세스의 영향

mmap시스템 호출을 통해 메모리에 매핑된 파일이 이후에 다른 프로세스에 의해 기록되면 어떤 일이 발생하는지 이해하려고 합니다 .

"Process A"에서 mmap메모리가 보호되어 있습니다 . PROT_READ프로세스 A에서 기본 파일 설명자를 닫고 다른 프로세스가 나중에 해당 파일에 쓰는 경우(사용되지 않음 mmap, 단순히 stdout을 >셸에서 사용되는 파일로 리디렉션) mmap프로세스 A의 주소 공간에 있는 ed 메모리가 영향을 받습니까? 이 페이지는 읽기 전용이므로 변경되지 않기를 바랍니다. 그러나 매핑된 메모리를 구문 분석하는 동안 SIGBUS잘못된 메모리 액세스()로 인한 신호에 의해 프로세스 A가 종료됩니다. Non-existent physical address at address 0x[...]나는 이것이 지원 파일에 쓰는 다른 프로세스로 인해 발생한 것으로 의심합니다. MAP_PRIVATE이 메모리를 다른 프로세스로부터 완전히 보호하기에 충분한 설정인가요 ?

답변1

프로세스 A에서 기본 파일 설명자를 닫으면

파일 설명자를 닫아도 전혀 변경되지 않습니다.

나중에 다른 프로세스가 파일에 씁니다(mmap을 사용하지 않고 단순히 셸에서 >를 사용하여 stdout을 파일로 리디렉션). 프로세스 A의 주소 공간에 있는 mmaped 메모리가 영향을 받습니까?

아마도 그렇습니다. 맨페이지는 다음과 같이 mmap(2)말합니다.

 MAP_PRIVATE
    ...
    It is  unspecified  whether changes made to the file
    after the mmap() call are visible in the mapped region.

실제로, 적어도 일반 파일의 경우에는 다른 프로세스에 의해 변경된 내용이 매핑된 영역의 내용에 반영되는 것으로 보입니다.

그러나 매핑된 메모리를 해결하려고 시도하는 동안 잘못된 메모리 액세스로 인해 프로세스 A가 SIGBUS 신호에 의해 종료됩니다(주소 0x[...]에 물리적 주소가 없음).

매핑 파일을 자르면 이런 일이 발생할 것으로 예상했습니다.

MAP_PRIVATE이 메모리를 다른 프로세스로부터 완전히 보호하기에 충분한 설정인가요 ?

아니요. MAP_PRIVATE메모리 수정 사항이 백업 파일로 전달되는 것을 방지할 뿐이며 그 반대는 아닙니다.

관련 정보