Researcher to Developer

IPC 기법 관련 시스템 콜 - 공유 메모리(shmid, shmget, shmaddr, shmdt, shmctl, etc) 본문

카테고리 없음

IPC 기법 관련 시스템 콜 - 공유 메모리(shmid, shmget, shmaddr, shmdt, shmctl, etc)

Probe29 2021. 1. 2. 18:16

ipcs

현재 커널 공간에 생성되어 있는 message queue, 공유 메모리 segments, semaphore arrays 정보를 표시하는 명령어

 

 

 

#공유 메모리 (shared memory)

노골적으로 커널 영역에 메모리 공간을 만들고, 해당 공간을 변수처럼 쓰는 방식
메세지 큐 처럼 FIFO 방식이 아니라 해당 메모리 주소를 변수처럼 접근하는 방식
공유 메모리 key를 가지고 여러 프로세스가 접근이 가능하다.
메세지 큐와 마찬가지로 key를 가지고 있다.

 

 

 

#공유 메모리 코드 예제

 

1. 공유 메모리 생성

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int shmget(key_t key, size_t size, int shmflg);

// key : 임의 숫자 또는 ftok 함수로 생성한 키 값
// size : 공유 메모리 크기
// shmflg : 공유 메모리를 어떤 권한으로 만들꺼냐, 속성에 대한 함수 
// 리턴 값 : 공유 메모리 식별자 리턴

// 예제 

shmid =shmget((ket_t)1234, SIZE, IPC_CREAT|0666))



 

2. 공유 메모리 연결
키가 생성이 되면 특정한 프로세스에 있는 변수에 이 메모리르 매핑을 시켜줘야한다.

 

#include <sys/type.h>
#include <sys/shm.h>

void *shmat(int shmid, const void *shmaddr, int shmflg);

// shmid : shmget 함수로 생성한 공유 메모리 식별자, ID
// shmaddr : 공유 메모리 연결 주소 (보통 (char *)NULL으로 설정하면, 알아서 적절한 주소로 연결,매핑)
// shmflg : 공유 메모리의 읽기/쓰기 권한 (보통 0이면 읽기/쓰기 가능, SHM_RDONLY면 읽기만 가능)
// 리턴 값 : 성공 시 연결된 공유 메모리의 시작 주소를 리턴

// 예제

shmaddr = (char *)shmat(shmid, (char *)NULL, 0)

shmaddr 이 변수를 공유 메모리에 해제 시킬 수 도 있다.

 



3. 공유 메모리 해제

#include <sys/types.h>
#include <sys/shm.h>

int shmdt(char *shmaddr);

해제만 하면 삭제가 아니기때문에 데이터가 남는다.


 

 

4. 공유 메모리 읽기/쓰기
포인터 변수처럼 사용하면 됨

공유 메모리에서 읽기
printf("%s\n", (char *)shmaddr)

공유 메모리에서 쓰기
strcpy((char *)shmddr, "Linux Programming")




5. 공유 메모리 삭제


shmctl()

공유 메모리 삭제에 사용되는 명령어

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

// shmid : shmget 함수로 생성한 공유 메모리 식별자
// cmd : 수행할 제어 기능 (ex. IPC_RMID - shmid 로 지정한 공유 메모리 제거)
// buf : 제어 기능에 사용되는 공유 메모리 구조체의 구조

// 예제

shmctl(shmid, IPC_RMID, (struct shmid_ds *)NULL);