공유 메모리 식별자 생성 : shmget()
- msgget()과 마찬가지로 플래그를 IPC_CREAT과 IPC_EXCL 사용
- 공유 메모리 식별자와 관련된 공유 메모리와 데이터 구조체가 새로 생성되는 경우
- key가 IPC_PRIVATE일 경우
- key가 0이 아니며 다른 식별자와 관련되어 있지 않고, 플래그(msgflg)에 IPC_CREAT가 설정 될 경우
int main(){
key_t key;
int shmid;
key = ftok("shmfile", 1);
shmid = shmget(key, 1024, IPC_CREAT|0644);
}
공유 메모리 연결 : shmat()
- shmaddr에는 특별한 경우가 아니면 NULL을 입력
- shmflg가 0이면 읽기 쓰기 가능, SHM_RDONLY면 읽기만
공유 메모리 연결 해제 : shmdt()
공유 메모리 제어 : shmctl()
- PC_STAT : 현재 공유 메모리의 정보를 buf로 지정한 제어 기능을 수행
- IPC_SET : 지정한 값으로 변경
- IPC_RMID : shmid로 지정한 공유메모리 제거 후 데이터 구조체 제거
- IPC_INFO
int main(){
int shmid, i;
char *shmaddr, *shmaddr2;
shmid = shmget(IPC_PRIVATE, 20, IPC_CREAT|0644);
switch(fork()){
case 0:
shmaddr = (char*)shmat(shmid, NULL, 0);
for(i = 0 ; i < 10; i++)
shmaddr[i] = 'a' + i;
shmdt(shmaddr);
exit(0);
break;
default:
wait(0);
shmaddr2 = shmat(shmid, NULL, 0);
for(i = 0; i < 10; i++)
printf("%c ", shmaddr2[i]);
sleep(5);
shmdt(shmaddr2);
shmctl(shmid, IPC_RMID, NULL);
}
}
Listener, Talker 예제 코드
- Listener(Server)
void handler(int dummy){}}
int main(){
key_t key;
int shmid;
void *shmaddr;
char buf[1024];
sigset_t mask;
key = ftok("shmfile", 1);
shmid = shmget(key, 1024, IPC_CREAT|0666);
sigfillsest(&mask);
sigdelset(&mask, SIGUSR1);
signal(SIGUSR1, handler);
printf("Listener wait for Talker\n");
sigsuspend(&mask);
printf("Listener Start\n");
shmaddr = shmat(shmid, NULL, 0);
strcpy(buf, shmaddr);
printf("Listener Received\n");
strcpy(shmaddr, "Have a nice day\n");
sleep(3);
shmdt(shmaddr);
}
공유 메모리와의 연결을 해제
- Talker(Client)
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 -mo");
shmdt(shmaddr);
shmctl(shmid, IPC_RMID, NULL);
}
공유 메모리 연결을 해제하고 공유 메모리 제거