본문 바로가기
한국으로/임베디드 리눅스

3.3 공유 메모리

by 영킴. 2018. 6. 27.

3.3 공유 메모리

3.3.1 개요



프로세스는 독립적인 주소공간(가상메모리)를 사용하기 때문에 변수를 공유할 수 없다.

공유 메모리를 통해 프로세스간 공유할수 있는 메모리를 구현하자!

각 프로세스는 자신의 주소 공간에 공유메모리를 위한 세그먼트(shmbuf)를 만들고, 이 구조체를 통해 공유메모리에 접근한다.


# ipcs -l

현재 공유 메모리의 정보를 확인하자



3.3.2 공유메모리 함수

int shmget(key_t key, size_t size, int shmflg);

기능: 공유메모리 생성
리턴: 성공 시 공유메모리 ID, 실패 시 errno 설정 후 -1 리턴
key: 공유메모리 접근 키
size: 생성할 공유메모리 크기
shmflg:  IPC_CREAT (공유메모리가 없으면 새로 생성), IPC_CREAT | IPC_EXCL (공유메모리가 있으면 에러)

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

기능: 프로세스의 주소 공간에 공유메모리 부착
리턴: 성공 시 부착된 공유메모리 주소, 실패 시 errno 설정 후 -1 리턴
shmid: 공유메모리 ID
shmaddr: NULL이면 비어있는 주소에 부착, 아니라면 이 주소에 부착
shmflg: SHM_RDONLY(읽기전용)

int shmdt(const void* shmaddr);

기능: 프로세스의 주소 공간에서 공유메모리 분리 (반납)
리턴: 성공 시 0, 실패 시 errno 설정 후 -1 리턴
shmaddr: 분리할 공유메모리 주소

shmat() 으로 공유메모리를 생성하고, shmdt()로 공유메모리를 반납해주자.

int shmctl(int shmid, int cmd, struct shmid_ds* buf);

기능: 공유메모리 제어
리턴: 성공 시 cmd 리턴값, 실패 시 errno 설정 후 -1 리턴
shmid: 공유메모리 ID
cmd: IPC_STAT(공유메모리 정보를 buf에 저장), IPC_RMID(공유메모리 제거)
buf: struct shmid_ds



'한국으로 > 임베디드 리눅스' 카테고리의 다른 글

5.1 프로세스 관리  (0) 2018.06.28
4.2 스레드 동기화  (0) 2018.06.28
4.1 스레드란?  (0) 2018.06.27
3.4 메시지 큐  (0) 2018.06.27
3.2 세마포어  (0) 2018.06.27
3.1 파이프  (0) 2018.06.27
2.2 시그널  (0) 2018.06.27
2.1 프로세스  (0) 2018.06.27