공유메모리 구조체 예제

uni 할당의 경우 최대 10 개의 파일 이름의 원형 목록을 만든 다음 공유 메모리 영역에 저장하여 2 개의 자식 프로세스가 목록에 읽기 / 쓰기 (세마포를 사용하여 액세스를 제어)할 수 있도록해야합니다. 문제는, 나는 총 C 초보자이고 나는 완전히 내 깊이에서 때문에 손실과 절망을 느낀다. 나는 내 지식의 “구멍을 채우기”에 약간의 도움이 필요합니다. 지금까지 보았듯이 shared_memory_object 및 file_mapping 개체를 모두 사용하여 mapped_region 개체를 만들 수 있습니다. 공유 메모리 개체 또는 파일 매핑에서 만든 매핑된 영역은 동일한 클래스이며 많은 장점이 있습니다. 마지막 두 예제에서는 여러 관련 프로세스 간에 메모리를 공유하는 것을 보여 줍니다. 관련 없는 프로세스 간에 공유 메모리가 필요한 경우 두 가지 대안이 있습니다. 응용 프로그램은 XSI 공유 메모리 함수를 사용하거나 mmap을 사용하여 MAP_SHARED 플래그를 사용하여 동일한 파일을 주소 공간에 매핑할 수 있습니다. 당신은 아마 Beej의 유닉스 IPC 가이드 유용 찾을 수 있습니다, 그것은 공유 메모리에 특히 섹션이 포함되어 있습니다. shmget은 디스크에 고정 크기 파일을 만드는 것과 같이 일부 공유 메모리를 예약합니다. 플래그는 낮은 9비트의 권한 마스크와 O_CREAT 및 O_EXCL에 해당하는 IPC_CREAT 및 IPC_EXCL의 추가 플래그입니다. 실제로 해당 메모리에 액세스하려면 프로세스의 주소 공간에 매핑해야합니다 (파일의 mmap과 유사합니다) 프로세스의 주소 공간에 매핑해야합니다. 이 작업은 shmat(포인터를 반환)을 사용하여 수행됩니다.

그런 다음 해당 포인터에서 FILE 구조를 할당해야 합니다. 전체 프로세스는 다음과 같습니다 : 그래서 당신은 정말 적어도 10 개의 FILE 구조의 배열에 대한 충분한 메모리를 분쇄해야합니다. 편집 :이 사이트에서 당신은 정말 간단한 예를 찾을 수 있습니다 : http://simplestcodings.blogspot.com/2010/08/ipc-shared-memory-implementation-in-c.html 당신은 shmat (식별자, NULL, 0)를 호출, 공유 메모리가 매핑 된 위치에 대한 포인터를 다시 얻기 프로세스에 있습니다. 해당 위치에 객체를 만들거나 해당 위치로 개체를 memcpy/memmove합니다. 각 프로세스마다 다른 가상 테이블 포인터가 필요하고 해당 포인터가 포함된 개체가 여러 프로세스에서 공유되므로 이 문제는 해결하기가 매우 어렵습니다. 매핑된 지역을 모든 프로세스에서 동일한 주소로 매핑하더라도 가상 테이블은 모든 프로세스에서 다른 주소에 있을 수 있습니다. 프로세스 간에 공유되는 개체에 대한 가상 함수를 사용하려면 심층 컴파일러 변경이 필요하며 가상 함수는 성능 저하를 겪습니다. 따라서 Boost.Interprocess는 프로세스 간에 공유되는 매핑된 영역에서 가상 함수 및 가상 상속을 지원할 계획이 없습니다. 공유 메모리에 의한 IPC는 예를 들어 유닉스 시스템의 응용 프로그램과 X 서버 간에 이미지를 전송하거나 Windows 아래의 COM 라이브러리에서 CoMarshalInterThreadInterfaceInStream에서 반환된 IStream 개체 내에서 이미지를 전송하는 데 사용됩니다.

지금은 한 번에 하나의 문제에 초점을 맞추고 있으며 현재는 내 원형 목록을 공유 메모리 영역으로 끌어 들이려고합니다. 공유 메모리 세그먼트가 만들어지면 프로세스는 shmat을 호출하여 주소 공간에 연결합니다. 여러 스레드 중에서 와 같이 단일 프로그램 내에서 통신을 위해 메모리를 사용하는 것을 공유 메모리라고도 합니다. 프로그램은 /dev/zero 장치를 열고 mmap을 호출하여 긴 정수 크기를 지정합니다. 지역이 매핑되면 장치를 닫을 수 있습니다. 그런 다음 프로세스에서 자식을 만듭니다. MAP_SHARED는 mmap 호출에 지정되었기 때문에 한 프로세스에 의해 메모리 매핑된 영역에 대한 쓰기가 다른 프로세스에서 볼 수 있습니다. 대신 MAP_PRIVATE을 지정한 경우 이 예제는 작동하지 않습니다. Boost.Interprocess는 POSIX 의미 체계 측면에서 휴대용 공유 메모리를 제공합니다. 일부 운영 체제는 POSIX에 정의된 대로 공유 메모리를 지원하지 않습니다: Boost.Interprocess는 XSI 공유 메모리사용을 용이하게 하기 위해 간단한(xsi_shared_memory) 및 관리형(managed_xsi_shared_memory) 공유 메모리 클래스를 제공합니다.