공유 메모리를 파일로 백업하는 것이 중요합니까? 그렇지 않다면 sys/shm.h에 선언 된 shmget, shmat, shmdt 및 shmctl과 같은 기본 Unix 공유 메모리 API의 사용을 고려할 수 있습니다. 나는 그 (것)들을 사용하기 아주 쉽다 찾아 냈다.
// create some shared memory
int id = shmget(0x12345678, 1024 * 1024, IPC_CREAT | 0666);
if (id >= 0)
{
void* p = shmat(id, 0, 0);
if (p != (void*)-1)
{
initialize_shared_memory(p);
// detach from the shared memory when we are done;
// it will still exist, waiting for another process to access it
shmdt(p);
}
else
{
handle_error();
}
}
else
{
handle_error();
}
다른 프로세스가 공유 메모리에 액세스하기 위해이 같은 것을 사용하는 것이 : 모든 프로세스가 공유 메모리와 함께 완료되면 다음, 다시 시스템을 출시 할 shmctl(id, IPC_RMID, 0)
를 사용
// access the shared memory
int id = shmget(0x12345678, 0, 0);
if (id >= 0)
{
// find out how big it is
struct shmid_ds info = { { 0 } };
if (shmctl(id, IPC_STAT, &info) == 0)
printf("%d bytes of shared memory\n", (int)info.shm_segsz);
else
handle_error();
// get its address
void* p = shmat(id, 0, 0);
if (p != (void*)-1)
{
do_something(p);
// detach from the shared memory; it still exists, but we can't get to it
shmdt(p);
}
else
{
handle_error();
}
}
else
{
handle_error();
}
.
명령 줄에서 ipcs 및 ipcrm 도구를 사용하여 공유 메모리를 관리 할 수 있습니다. 처음 공유 메모리 코드를 작성할 때 실수를 정리하는 데 유용합니다.
이 모든 것들은 32 비트와 64 비트 프로그램간에 메모리를 공유하는 것에 대해 확신하지 못했습니다. 유닉스 API를 사용하는 것이 좋으며, 실패한다면 아마 할 수 없다. Boost는 구현시 사용됩니다.
죄송합니다. 크로스 플랫폼 코드를 유지해야하기 때문에 원시 유닉스 공유 메모리 API를 사용할 수 없습니다. – MacGeek
@ Rahul, 어떤 플랫폼을 타겟팅하고 있습니까? –
WIN XP/VISTA/7 & MAC OS 10.6/7 – MacGeek