Shared memory
- 같은 메모리 공간을 프로세스들이 공유
- 동시에 Read/Write가 가능
- Synchronization(동기화 필요)
- Dynaminc allocation -> fork()인 경우, 공유되지 않고 메모리 영역의 복사본이 생성됨
allocation shared memory segment
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
- key : IPC key
- IPC_PRIVATE : private shared memory 생성
- size : 공유할 메모리 크기(bytes)
- shmflg : 생성 방법 및 접근 권한
- IPC_CREAT : key에 대한 shared memory가 없으면, 생성
- IPC_EXCL : key에 대한 shared memory가 있으면, error
- return : 생성된 shared memory 객체의 identifier
attaching shared memory
#include <sys/types.h>
#incldue <sys/shm.h>
void* shmat(int shmid, const void* shmaddr, int shmflg);
- Shared mem.을 프로세스의 address space로 매핑
- shmid : shared memory segment ID
- shmaddr : shared memory를 연결할 주소
- Generally, 0(NULL) : 시스템이 적절한 주소 선택
- shmflg : shared memory에 대한 접근 권한
- 0 : Read/Write
- SHM_RDONLY : Read only
- return : 매핑된 주소, -1 : error
detaching shared memory
#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void* shmaddr);
- Address mapping 해제
- shmaddr : 연결을 해제할 메모리 주소
- return
controlling shared memory
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds* buf);
- shmid : shared memory segment ID
- cmd : 수행할 제어기능
- IPC_STAT : shmid에 해당하는 shmid_ds를 읽어옴
- IPC_RMID : shmid에 해당하는 shared memory 삭제
- buf : 제어기능에 사용되는 구조체
- return
Example
server
#include <sys/types.h>
#include <signal.h>
#include <sys/mman.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void handler(int dummy) {}
int main(void) {
key_t key;
int shmid;
void* shmaddr;
char buf[1024];
sigset_t mask;
key = ftok("shmfile", 1);
shmid = shmget(key, 1024, IPC_CREAT|0666);
sigfillset(&mask);
sigdelset(&mask, SIGUSR1);
sigset(SIGUSR1, handler);
printf("Listener wait for Talker\n");
sigsuspend(&mask);
printf("Listener Start ====\n");
shmaddr = shmat(shmid, NULL, 0);
strcpy(buf, shmaddr);
printf("Lister received : %s\n", buf);
strcpy(shmaddr, "Have a nice day\n");
sleep(3);
shmdt(shmaddr);
return 0;
}
client
#include <sys/types.h>
#include <signal.h>
#include <sys/mman.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv) {
key_t key;
int shmid;
void* shmaddr;
char buf[1024];
key = ftok("shmfile", 1);
shmid = shmget(key, 1024, 0);
shmaddr = shmat(shmid, NULL, 0);
strcpy(shmaddr, "Hello, I'm talker\n");
kill(atoi(argv[1]), SIGUSR1);
sleep(2);
strcpy(buf, shmaddr);
printf("Listener said : %s\n", buf);
system("ipcs -m");
shmdt(shmaddr);
shmctl(shmid, IPC_RMID, NULL);
return 0;
}