이 프로세스는 부모로부터 매핑을 상속해야합니다 ... 공유 메모리에 가깝습니다. 그러나 매핑이 파일에 의해 뒷받침되는 경우 그러한 요구 사항은 없습니다. shmat
, 일명 System V 공유 메모리는 문제가없는 것이 아니며, 전통적으로 제한된 리소스 였지만 한도를 높이려면 sysctl과 root를 사용해야합니다.
mmap
두 프로세스 모두 동일한 파일을 열고 매핑 할 수 있으며 다음 파일의 연결을 해제 할 수 있습니다. 이제 모든 프로세스가 파일을 종료하면 자동으로 제거됩니다. 또는 처음에 연결 해제 될 수 있습니다. 서버 프로세스는 유닉스 소켓을 통해 열린 파일 디스크립터를 클라이언트에 공유 할 수 있습니다.
물론 파일 백업과 함께 mmap을 사용하면 매핑을 백업하기 위해 실제 디스크 공간이 필요하며 매핑은 디스크로 플러시됩니다. ((2) 등하는 shmget (2)은 shmop) 이전입니다
시스템 V 공유 메모리 : 당신이 디스크 파일에 의해 백업되지 않습니다 매핑을 원하는 경우에
, 당신은 POSIX shared memory objects을 사용할 수 있습니다 공유 메모리 API. POSIX 공유 메모리는 더 간단하고 잘 설계된 인터페이스를 제공합니다. 반면에 POSIX 공유 메모리 은 System V 공유 메모리보다 다소 덜 널리 사용 가능합니다 (특히 구형 시스템에서). 이러한 본질적 /dev/shm
의 파일 만이를 사용할 수있는 휴대용 방법입니다 리눅스
는
만들고 shm_open
로를 열 수 있습니다. 다시 말하지만 공유 메모리 객체가 shm_unlink
과 연결이 해제 된 경우에도 공유 메모리 객체가 열린 프로세스는 유닉스 도메인 소켓을 통해 열린 파일 디스크립터를 보낼 수 있으며 수신자는 디스크립터를 사용하여 공유 메모리를 그 프로세스 공간.
따라서 같은 : 첫 번째 과정에서
fd = shm_open("/my_shared_mem", O_RDWR|O_CREAT, 0700);
ftruncate(fd, 64 * 4096);
shared_mem = mmap(NULL, 64 * 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)
는, 두 번째는 O_RDWR
열 수 및 절단 할 필요가 없습니다. 공유 메모리 개체를 제거하려면 shm_unlink
사용
shm_unlink("/my_shared_mem");
즉시 /dev/shm
에서 연결을 해제 할; 열린 프로세스는 계속 사용할 수 있습니다. 객체는 실제로 모든 프로세스가 그것을 사용하지 않을 때만 제거됩니다.
프로세스는 메모리 맵에 사용되는 * backing *을 공유 할 수 있습니다. 일반적으로 이것은 tmpfs ('/ dev/shm /'에 있음)의 백업 파일에 대한 열린 파일 설명자 일 뿐이지 만 다른 옵션도 있습니다. 매핑을 공유하는 것은 기본적으로 프로그래머 관점에서 똑같은 방식으로 동작 할지라도 서로 다른 매핑에 사용되는지지를 공유하는 것과는 다른 메커니즘이기 때문에이를 대답으로 작성하지 않았습니다. –