본문 바로가기
  • fishing...
  • eating...
MISCELLANEOUSNESS

How to use shared memory on linux

by 회색뿔 2010. 6. 24.


pipe를 이용한 data memory share는 부모 <-> 자식 프로세스 사이에 공유에만 적용이된다.
하지만, 부모 자식 관계 외에도 서로 다른 별개의 프로세스간에 정보를 공유하기 위한 방법은 다음의 함수들을 이용한 방법을 이용한다.

간단하다면 간단하고 복잡하다면 복잡하다는 이용 scenario.

A 프로세서에서 shmget()를 이용하여 shared memory의 fd(file descriptor)를 반환 받는다. 이때 인자로는 이 공유 메모리를 식별 할 수 있는 key를 넘겨준다. shmat()에서 이 fd를 이용하여 pointer를 받을 수 반환 받을 수 있다. 이 이후에 Read/Write 작업을 수행 후 shmdt()를 이용하여 해제한다.

B 프로세서에서 shmget()를 이용하여 shared memory의 fd( file descriptor)를 반환 받고,  shmat()에서 이 fd를 이용하여 pointer를 받을 수 반환 받을 수 있다. 이 이후에 Read/Write 작업을 수행 후 shmdt()를 이용하여 해제한다.

Concept Shared mem.




//---------------------------- send.c
#include 
#include 
#include 

void main()
{
	int id;
	char *p;

	id = shmget( 0x777, 100, IPC_CREAT );
	p = (char *p)shmat( id, 0, 0 );
	gets( p );
	shmdt(p);
}

//----------------------------recv.c
#include 
#include 
#include 

void main()
{
	int id;
	char *p;

	id = shmget( 0x777, 100, IPC_CREAT );
	p = (char *p)shmat( id, 0, 0 );
	printf("%s", p );
	shmdt(p);
}


int shmget(key_t key, int size, int shmflg);
헤더

#include <sys/ipc.h>
#include <sys/shm.h>

형태 int shmget(key_t key, int size, int shmflg);
인수
key_t key 공유 메모리를 구별하는 식별 번호
int size 공유 메모리 크기
int shmflg 동작 옵션

shmflg 옵션 내용
IPC_CREATE key에 해당하는 공유 메모리가 없다면 새로 생성한다. 만약있다면 무시하며 생성을 위해 접근 권한을 지정해 주어야 한다.
IPC_EXCL 공유 메모리가 이미 있다면 실패로 반환하며 공유 메모리에 접근하지 못한다. 이 옵션이 없어야 기존 공유 메모리에 접근할 수 있다.
반환
-1 실패
-1 이외 공유 메모리 생성 성공, 공유 메모리 식별자

void *shmat(int shmid, const void *shmaddr, int shmflg);
헤더

#include <sys/type.h>
#include <sys/shm.h>

형태 void *shmat(int shmid, const void *shmaddr, int shmflg);
인수
int shmid 공유 메모리를 구별하는 식별 번호
void *shmaddr 첨부되는 어드레스 주소. 일반적으로 NULL을 지정
int shmflg

동작 옵션

shmflg 옵션 내용
SHM_RDONLY 공유 메모리를 읽기 전용으로
SHM_RND shmaddr이 NULL이 아닌 경우일 때만 사용되며, shmaddr을 반올림하여 메모리 페이지 경계에 맞춘다.

 

반환
(void *) -1 실패
이외 프로세스에 첨부된 프로세스에서의 공유 메모리 주소

int shmdt(const void *shmaddr);
헤더

#include <sys/type.h>
#include <sys/shm.h>

형태 int shmdt(const void *shmaddr);
인수
void *shmaddr 분리할 공유 메모리 주소
반환
-1 실패
0 공유 메모리 분리 성공