c++ 공유 메모리 예제

이 예제에서는 서버와 클라이언트가 별도의 프로세스입니다. 첫째, 공유 메모리를 통한 순진한 의사 소통 체계가 설정됩니다. 공유 메모리는 하나의 상태 변수 상태와 4개의 정수 배열로 구성됩니다. 변수 상태는 데이터 영역이 아직 데이터로 채워지지 않은 경우 NOT_READY 값을 가지며, 서버가 공유 메모리에 데이터를 입력한 경우 채워지고 클라이언트가 공유 메모리의 데이터를 가져온 경우 촬영합니다. 정의는 다음과 같습니다. 이 파일을 다운로드하려면 여기를 클릭하십시오 (shm-02.h). 그러나 기본 Windows 공유 메모리에 액세스하는 것은 Boost.Interprocess를 사용하지 않는 다른 프로세스로 만든 공유 메모리에 액세스하려고 하기 때문에 Boost.Interprocess 사용자의 일반적인 요청입니다. 네이티브 창을 관리 하기 위해 공유 메모리 Boost.Interprocess windows_shared_memory 클래스를 제공 합니다. 공유 메모리 개체가 없거나 다른 프로세스에서 열리는 경우 이 함수가 실패할 수 있습니다. 이 함수는 표준 C int remove(const char *path) 함수와 유사합니다. UNIX 시스템에서 shared_memory_object::remove 호출 shm_unlink: 예를 들어 공유 메모리 및 메모리 매핑된 파일에서 매핑된 STL 컨테이너에 혼합할 수 있습니다. 매핑된 영역에만 종속된 라이브러리는 다시 컴파일하지 않고도 공유 메모리 또는 메모리 매핑된 파일로 작업하는 데 사용할 수 있습니다.

첫 번째 프로세스는 CREATEFileMapping 함수를 INVALID_HANDLE_VALUE와 개체의 이름을 호출하여 파일 매핑 개체를 만듭니다. PAGE_READWRITE 플래그를 사용하면 프로세스가 생성된 모든 파일 뷰를 통해 메모리에 대한 읽기/쓰기 권한을 부여합니다. 두 프로세스가 메모리에 동일한 파일을 매핑하면 한 프로세스가 쓰는 메모리가 다른 프로세스에서 볼 수 있으므로 메모리 매핑된 파일을 프로세스 간 통신 메커니즘으로 사용할 수 있습니다. 메모리 매핑된 파일은 파일 시스템 지속성을 추가하여 공유 메모리와 동일한 프로세스 간 통신 서비스를 제공한다고 말할 수 있습니다. 그러나 운영 체제가 파일 내용을 메모리 내용과 동기화해야 하므로 메모리 매핑된 파일은 공유 메모리만큼 빠르지 않습니다. Boost.Interprocess는 POSIX 의미 체계 측면에서 휴대용 공유 메모리를 제공합니다. POSIX에 정의된 대로 일부 운영 체제는 공유 메모리를 지원하지 않습니다. 네이티브 윈도우 공유 메모리는 또 다른 제한 사항이 있습니다: 프로세스가 열리고 다른 프로세스에 의해 생성 된 전체 공유 메모리를 매핑할 수 있지만 해당 메모리의 크기를 알 수 없습니다.

이 제한은 Windows API에 의해 부과되므로 사용자는 세그먼트를 여는 프로세스로 세그먼트 크기를 전송해야 합니다. 공유 메모리 개체가 만들어지면 크기는 0입니다. 공유 메모리의 크기를 설정하려면 읽기 쓰기 특성으로 열린 공유 메모리에서 truncate 함수 호출을 사용해야 합니다. 보이드 *shmat (int shmid, 보이드 * shmaddr, int shmflg); shmid는 공유 메모리 ID입니다. shmaddr는 사용할 특정 주소를 지정하지만 0으로 설정해야하며 OS는 자동으로 주소를 선택합니다. 상대 포인터를 사용하는 것이 원시 포인터를 사용하는 것보다 효율적이지 않으므로 사용자가 동일한 파일 또는 공유 메모리 개체를 두 프로세스의 동일한 주소에서 매핑하는 데 성공할 수 있다면 원시 포인터를 사용하는 것이 좋습니다. 여러 프로세스가 동일한 파일을 매핑하고 프로세스가 다른 프로세스에 의해 매핑되는 매핑된 영역에서 메모리 범위를 수정하는 경우 변경 내용은 다른 프로세스에 즉각적으로 표시됩니다.