1. Shared memory 리란?
- IPC(Inter-Process Communication) 의 일종으로 프로세스간 통신 할때 사용한다.
2. 데이터 공유 방식
- 커널에 생성된 공유 메모리를 통해서 프로세스간 데이터를 공유한다.
- 공유된 메모리 영역을 통해서 통신이 가능하다.
- 단순히 공유 메모리를 point 함으로써 프로세스에서 사용되는 메모리가 증가되지는 않는다.
3 . shared memory를 사용하기 위해서 필요한 헤더 및 함수
1)헤더
- #include <sys/ipc.h>
- #include <sys/shm.h>
2) 함수
- int shmget(key_t key, int size, int shmflg)
=> shared memory 생성 또는 가져오는 함수
- void *shmat( int shmid, const void *shmaddr, int shmflg )
=> process에 shared memory를 할당하는 함수
- int shmdt( const void *shmaddr)
=> process에 할당된 shared memory를 분리하는 함수
- int shmctl(int shmid, int cmd, struct shmid_ds *buf)
=> shared memory를 제어하는 함수
4. shared memroy를 사용하기 위한 sample 코드
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <unistd.h>
typedef struct _shm_info{
char str_ip[40];
unsigned int int_ip;
unsigned int int_id;
}SHM_INFOS;
int main()
{
int shmid;
int i;
SHM_INFOS *shm_info= NULL;
void *shared_memory = (void *)0;
// 1.번 그림의 (1)에 해당, 공유메모리 공간을 가져온다. 없을시 생성
// shmget 세부사용법은 인터넷 검색 바람
shmid = shmget((key_t)3836, sizeof(SHM_INFOS)*SHM_INFO_COUNT, 0666|IPC_CREAT);
if (shmid == -1)
{
//이미 공유 메모리가 생성되어 있을 경우,
// shmget에서 설정한 공유메모리 크기와 이미 생성된 공유메모리의 크기가 같지 않을때 발생
perror("shmget failed : ");
exit(0);
}
// 1번 그림의 (2)에 해당, 공유 메모리를 process와 연결 시킨다.
shared_memory = shmat(shmid, (void *)0, 0);
if (shared_memory == (void *)-1)
{
perror("shmat failed : ");
exit(0);
}
// 공유메모리에 데이터 쓰기
shm_info = (SHM_INFOS *)shared_memory;
while(1)
{
for(i=0 ;i < SHM_INFO_COUNT; i++){
snprintf(shm_info[i].str_ip,sizeof(shm_info[i].str_ip),"1.1.1.%d",i);
shm_info[i].int_ip = 12891010 +i;
shm_info[i].int_id = 128 + i;
}
}
}
5. shared memroy를 제거하기 위한 sample 코드
typedef struct _shm_info{
char str_ip[40];
unsigned int int_ip;
unsigned int int_id;
}SHM_INFOS;
'프로그래밍 > 리눅스 프로그래밍' 카테고리의 다른 글
[Segfault] 기초 편 : Linux의 Segmentation Fault(Segfault) 분석 방법 (0) | 2018.08.26 |
---|---|
[libcurl] libcurl + openssl + multi thread 처리에 대한 고민 (2) | 2018.04.30 |
[libcurl] 사용법 및 connection 유의 사항 (0) | 2018.03.24 |
한글 encoding 차이로 인한 memcmp 및 strncmp 동자 오류 (0) | 2018.03.21 |
[libcurl] post data 전송 (0) | 2018.03.21 |