일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 자료구조
- JUCE
- Nebula
- Docker
- BOJ
- 코딩
- 프로그래밍
- 백준
- JUCE라이브러리
- vim-go
- a tour of go
- JUCE library
- OS
- 운영체제
- C++ gui
- gui
- C++ library
- 공룡책
- tour of go
- JUCE 튜토리얼
- c++ heap
- go channel
- C++
- 리듬게임
- C언어
- C++ gui 라이브러리
- go
- LOB
- 연결리스트
- 알고리즘
- Today
- Total
CafeM0ca
[C]공유메모리 본문
공유메모리는 프로세스가 메모리를 공유해서 쓰는 메모리다. 그럼 누가 메모리를 연결 시켜주는가? 이 문제는 통신 문제로 넘어가서 서버와 클라이언트의 관계에 놓인다. a프로세스가 공유메모리를 사용할 수 있도록 열어주고(서버) b프로세스가 공유메모리에 접근한다(클라이언트)
장점: 자원을 공유해서 쓸 수 있다. (ex: 쓰레드)
단점: 같은 자원을 공유해서 쓰다 보니까 항상 경쟁 상태다. -> 교착 상태 발생 가능성 있음
잘 쓰면 금이고 잘못 쓰면 독이 되니 메모리 관리 잘 하면서 써야된다.
공유메모리는 shm로 생겼는데 처음에 쉬므라 읽었는데 곰곰히 생각해보니 share memory로 읽는게 맞는 듯 하다.(shmget 쉐어 메모리 겟)
생성->첨부->사용->때어냄->제거
shmget(key_t,size,shmflg) : 공유메모리 생성
성공 0 ,실패 -1반환
key_t에 size(byte)만큼의 크기를 shmflg 따라 처리
shmflg
-IPC_CREAT :새로운 영역할당
-IPC_EXCL:영역이 있는지 확인, 존재하면 에러 리턴
shmat(shmid,shmaddr,shmflg) : 만든 공유메모리를 프로세스가 사용할 수 있게(첨부)
shmid(공유메모리식별자)
shmaddr(공유메모리주소, 보통 NULL)
shmflg(옵션)
-SHM_RDONLY(read only):읽기전용
-SHM_RND:shmaddr이 NULL이 아닌 값일 때,시스템이 메모리세그먼트,프로세스 내부 주소를 관리하도록 함
shmdt(shmaddr) :공유메모리 삭제
shmaddr(주소)를 지운다. 성공시 0, 실패시 -1 반환
shmctl(shmid,cmd,shmid_ds *buf) : 프로세스에 첨부된 공유메모리 때어냄
shmid(공유메모리식별자)
cmd(제어명령)
shmid_ds(공유메모리 정보 구조체)
성공시 0,실패시 -1
server.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include<sys/ipc.h> #include<sys/shm.h> #include<stdlib.h> #include<stdio.h> const int SHSIZE=1024; int main(void) { int shmid; char *shmaddr,ch; key_t key=7530; //공유 메모리를 구분하는 구조체 //key값의 공유메모리 생성 if((shmid=shmget(key,SHSIZE,IPC_CRAETE))==-1){ perror("공유메모리 생성실패"); //에러 메시지를 띄우는 함수 stdin에 정의 exit(1); //프로세스 강제종료 stdlib에 정의 //공유메모리 첨부 if((shmaddr=shmat(shmid,NULL,0))==(char *)-1){ perror("공유메모리 첨부실패"); exit(1); } //공유메모리에 내용 삽입 for(ch='a';ch<='z';ch++) *shmaddr++=ch; //공유메모리 시작주소부터 하나씩 넣으면서 증가 while(*shmaddr=='*'){ //클라이언트가 공유메모리에서 작업을 한 뒤 *을 입력해 주기를 기대 printf("공유 메모리에 *이 입력되기를 기다리는 중\n"); sleep(1000); } return 0; } | cs |
client.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include<sys/shm.h> #include<stdio.h> #include<stdlib.h> const int SHMSIZE=1024; int main() { char *shmaddr,*c; key_t key=7530; int shmid; //공유메모리 생성, 있으면 그대로 아무 일 안함 if((shmid=shmget(key,SHMSIZE,IPC_CREAT))==-1){ perror("fail making share memory"); exit(1); } //공유 메모리를 프로세스에 첨부 if((shmaddr=shmat(shmid,NULL,0))==(char *)-1){ perror("fail attach prosess"); exit(1); } //공유메모리 시작지점부터 끝나는 지점점까지 출력 정확히는 *c<=shmaddr+SHMSIZE for(c=shmaddr;*c!='\0';c++) printf("%c",*c); putchar('\n'); return 0; } | cs |
클라이언트가 *을 입력해주지 않았으므로 공유메모리는 떨어지고,소멸되지 않는다.
직접 써보니까 잘만 쓰면 좋은 프로그램이 되는데 한 몫 할 듯하다.
'Programming > System Programming' 카테고리의 다른 글
[C]소켓프로그래밍 (0) | 2018.02.02 |
---|