Study Record

[리버싱 기초개념] 공유메모리 본문

리버싱/기초 개념

[리버싱 기초개념] 공유메모리

초코초코초코 2021. 11. 17. 10:10
728x90

공유 메모리 관련 함수

 

☞ shmget()

#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, int size, int shmflg);

/*
공유 메모리를 생성하거나 공유 메모리를 사용할 수 있는 함수이다.
리턴값 : 성공시 공유 메모리 ID(공유 메모리 식별자), 실패시 -1

key_t key  : 공유 메모리를 읽기 위한 key 변수
int size   : 공유 메모리의 크기
shmflg     : 공유 메모리 생성이나 사용 옵션을 지정
               - IPC_CREAT : 공유 메모리 생성
               - 0666      : 공유 메모리 사용 권한
*/


int shm_id = shmget((key_t)7530, 1024, IPC_CREAT|0666);

 

☞ shmat()

#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
/*
이미 할당된 공유 메모리 공간을 다른 프로세스에서 사용할 수 있게 권한을 부여하는 함수이다.
생성된 공유 메모리를 프로세스에 연결(Attach)한다.

리턴값 : 실패시 (void *)-1, 성공시 프로세스 공유 메모리 접근 주소
shmid      : 공유 메모리를 생성할 때 만들어진 공유 메모리 ID - shmget()에서 얻은 shm_id
shmaddr	   : 공유 메모리가 할당된 주소
shmflg     : 공유 메모리 사용 옵션을 지정
             - SHM_RND : 공유 메모리 주소를 프로세스에 맞게 따로 할당
             - SHM_RDONLY : 공유 메모리를 읽기 전용으로 설정
*/

int shm_id = shmget((key_t)7530, 1024, IPC_CREAT|0666);
void *shm_addr=(void * )0;
// 이미 메모리에 떠있으니 shmaddr은 0으로 설정해도 된다. 반환값으로 공유메모리 접근 주소를 받는다.
shm_addr = shmat(shm_id, (void *)0, 0); 
if (shm_addr == (void * )-1) 실패;
else 성공;

 

☞ shmdt()

#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr);
/*
프로세스에 연결된 공유 메모리 공간의 사용을 끝낸 후 프로세스와 공유 메모리 공간의 연결을 끊는다.
프로세스에 연결된 공유 메모리를 분리(Detach)

리턴값 : 실패시 -1
shmaddr : 공유 메모리가 할당된 주소 - shmat() 반환값
*/

int shm_id = shmget((key_t)7530, 1024, IPC_CREAT|0666);
void *shm_addr = shmat(shm_id, (void *)0, 0); 
shmdt(shm_addr);
728x90