왜?

왜?

공유 객체를 생성한 프로세스에서 공유 메모리에 대한 쓰기 권한을 취소하여 쓰기 권한이 있는 가상 공간에 공유 메모리를 매핑한 다른 프로세스가 권한이 부여된 후 실제로 쓰기를 시도할 때 실패하도록 할 수 있는 방법이 있습니까? 취소됐나요?

처음에는 fchmod()공유 메모리 개체를 사용하여 쓰기 권한을 취소 하면 shm_open()공유 메모리 개체가 매핑된 PROT_WRITE다른 프로세스에 의한 모든 후속 쓰기로 mmap()인해 세그폴트가 발생할 것으로 예상했습니다. 그러나 이것은 사실이 아니다.

이제 내가 원하는 동작을 달성하는 다른 방법(시스템 호출, 공유 메모리 API..)이 있는지 궁금합니다.

내 애플리케이션을 부팅할 때 RDMA 사용을 위해 공유 메모리 객체를 등록할 때 쓰기 권한이 필요합니다. 그러나 궁극적으로 나는 로컬 프로세스가 공유 메모리 개체에 쓸 수 없도록 하고 싶습니다.

답변1

이는 Linux 권한 모델에서는 불가능합니다. 귀하가 요청한 양식에 대한 직접적인 메커니즘이 있을 가능성은 거의 없습니다.

왜?

프로세스가 파일을 mmap하면 파일에 대한 액세스는 다음을 통해 이루어집니다.가상 주소 지정. 개별 읽기/쓰기는 확인되지 않으며 이는 성능을 위한 것입니다. 이것이 실제로 메모리 매핑의 핵심입니다. 언제DMA, 메모리 매핑을 사용하면 CPU 오버헤드가 거의 0에 가까운 파일 액세스가 가능합니다. 즉, 파일이 메모리 매핑된 후 페이지가 아직 디스크에서 로드되지 않았거나 변경 사항을 다시 디스크로 플러시하기 시작할 합당한 이유가 있는 경우에만 커널이 참여하면 됩니다. 다른 모든 것은 가상 주소 지정을 통해 처리됩니다.

사실 이 문제는 생각보다 훨씬 심각합니다. 프로세스가 파일을 읽고 쓸 수 있도록 하려면 다음을 사용하십시오.읽다()그리고쓰다()아니요한 번파일에 대한 권한이 있습니다. 필요한 것은 개방형 FD(파일 설명자). 파일 권한대개프로세스를 차단하면 이를 달성할 수 있지만 완전히 차단하지는 않습니다. FD는 unix-domain-socket을 사용하여 프로세스 간에 전달될 수 있습니다. 따라서 권한이 있는 프로세스는 열려 있는 FD를 권한 없이 다른 프로세스에 전달할 수 있습니다.

해결책

귀하의 질문이 완전히 명확하지 않습니다. 애플리케이션에는 읽기 전용 액세스가 필요하고 다른 항목에는 RDMA를 통해 읽기-쓰기 액세스가 필요하다고 생각합니다.

이런 경우에는 파일을 두 번 메모리 매핑하는 것이 좋습니다. 한 번은 쓰기 권한이 있고 한 번은 쓰기 권한이 없습니다. 하나의 메모리 맵에 대한 변경 사항은 설정하는 한 다른 메모리 맵에 전파됩니다 MAP_SHARED.

RDMA가 작동하는 프로세스에서 쓰기 액세스를 열어 두어야 하는 경우 언제든지 다음을 수행할 수 있습니다.십자가(), 한 프로세스에서는 쓰기 액세스 권한을 유지하고 다른 프로세스(애플리케이션)에서는 읽기 전용 액세스 권한을 유지합니다. 귀하의 질문에서 이것이 필요한지 확실하지 않습니다.

관련 정보