한국으로/임베디드 리눅스
3.3 공유 메모리
영킴.
2018. 6. 27. 23:13
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