공유메모리 사용 내역을 알아보기 위해 ipcs -a를 사용했다.
key가 0x00001d6a를 10진수로 바꾸면 7530이다. 힌트에서 언급한 숫자와 같다.
이 코드부분은 (http://molrayo.tistory.com/entry/Network-shmgetshmatshmdtshmctl-%EA%B4%80%EB%A0%A8-%EC%98%88%EC%A0%9C)를 참고했다.
공유메모리에 대한 지식이 많이 없는 상태에서 코드들을 뒤져보며 이해한 건,
1. shmget()
int shmget(key_t key, int size, int shmflg);
shmget을 통해 공유메모리에 접근하는데 여기서 key_t값을 전에 확인한 7530으로 설정하였다. shmget함수는 공유메모리의 ID값을 리턴하기때문에 이를 shmid에 저장한다.
2. shmat()
void *shmat(int shmid, const void* shmaddr, int shmglf)
shmat는 공유메모리를 프로세스에 첨부한다. 붙이는 영역은 shmaddr로 결정할 수 있는데 NULL인경우 시스템이 알아서 적당히 붙인다고 한다.
그리고 shmat()함수는 해당 공유 메모리 id값에 대한 어드레스를 리턴해준다.
3. shmctl()
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmctrl()은 공유메모리를 제어한다. 즉 공유메모리의 내용을 받아오거나 수정, 삭제 하기 위해 사용한다.
이 코드의 경우 공유메모리의 내용을 받아와야하기 때문에 가장먼저 shmget()을 통해 접근하고, shmat()를 통해 프로세스에 첨부한 뒤, shmctl()에서 IPC_STAT을 사용해서 메모리의 내용을 받아왔다.
일단 대개 이해는 가지만 나중에 코드를 직접 짜면서 여러번 복습해야하는 부분인 것같다.
이 프로그램을 컴파일해서 실행하면 대화내용이 나온다
그리고 대화 내용에는 비밀번호가 적혀있는것을 알 수 있다.