공유 메모리

 

 

 

 

■ 단원의 목적

공유 메모리(Shared Memory)에 데이터를 읽고 쓰기

 

: 하드코딩의 위험성 때문에

메모리에 데이터를 저장하기 시작했다.

메모리상에 올라가는 세션키를 통해 암복호화를 하는데..

 

 

■ 프로세스(Process)와 프로세스(Process)가 통신(메세지를 주고 받는 방법)

소켓 사용하는 경우(EX: Clint/Server 프로그램)

공유메모리를 사용하는 방법(EX: DB 프로그램(Oracle))

파일을 사용하는 경우

DB 사용하는 경우

기타

 

 

 보안적인 요소에서 공유메모리를 쓰고 있는 대표적인 경우

암호화/복호화 방식(핵심: key)

 

 

 


 

 

*잡식*

fd = file disk return

[level10@ftz level10]$ find / -type f -exec egrep -l /home/level10/program {} \; 2>/dev/null

 

 

[level10@ftz level10]$ ipcs

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00001d6a 0 root 666 1028 0

0x00002328 98306 level9 666 1024 0

 

------ Semaphore Arrays --------

key semid owner perms nsems

 

------ Message Queues --------

key msqid owner perms used-bytes messages

 

 

 

 


 

 

 

 

공유 메모리 관련 함수

 

 

shmget() 함수

공유 메모리를 생성하거나 공유 메모리를 사용할 수 있는 함수

-> 공유 메모리를 생성하거나 생성된 공유 메모리의 ID 반환

형식 : int shmget(key_t key, int size, int shmflg);

- key_t key : 공유 메모리를 읽기 위한 key 변수

- int size : 공유 메모리의 크기

- int shmflg : 공유 메모리 생성이나 사용 옵션을 지정

- IPC_CREAT : 공유 메모리 생성

- 0666 : 공유 메모리 사용 권한

 

반환 :

- 실패: -1

- 성공: -1 이외의 값, (공유 메모리 식별자)

 

예제:

int shm_id;

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

if (shm_id == -1) 실패;

else 성공

 

 

 

 shmat() 함수/shmdt() 함수

 

NAME

shmop - shared memory operations

 

SYNOPSIS

#include <sys/types.h>

#include <sys/shm.h>

 

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

 

int shmdt(const void *shmaddr);

 

 

 

shmat() 함수

이미 할당된 공유 메모리 공간을 다른 프로세스에서 사용할 수 있게 권한을 부여하는 함수

-> 생성된 공유 메모리를 프로세스에 연결(Attach)

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

- int shmid : 공유 메모리를 생성할 때 만들어진 공유 메모리 ID

- const void *shmaddr : 공유 메모리가 할당된 주소

- int shmflg : 공유 메모리 사용 옵션을 지정

- SHM_RND : 공유 메모리 주소를 프로세스에 맞게 따로 할당

- SHM_RDONLY : 공유 메모리를 읽기 전용으로 설정

반환:

(실패) (void *)-1 :

(성공) 프로세스 공유 메모리 접근 주소

예제:

int shm_id;

void *shm_addr=(void * )0;

shm_addr = shmat(shm_id, (void *)0, 0);

if (shm_addr == (void * )-1) 실패;

else 성공;

 

[참고] http://forum.falinux.com/zbxe/index.php?document_srl=426102&mid=C_LIB

 

 

shmdt() 함수

다른 프로세스에 연결된 공유 메모리 공간의 사용을 끝낸 후 프로세스와 공유 메모리 공간의 연결을 끊는다.

-> 프로세스에 연결된 공유 메모리를 분리(Detach)

형식 : int shmdt(const void *shmaddr);

- const void *shmaddr : 공유 메모리가 할당된 주소

 

 

 


 

 

 

* 공유 메모리(key_t 7530)에 접근하여 정보 읽는 프로그램 만들기

/* Header Files */
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>


/* Global Variable */

/* Function */


/* Main Functtion */

int main(void)
{
    int shm_id;
    void *shm_addr = (void *)0;
    char buf[1024];

    // (1) Approach Memory address shmget
    shm_id = shmget(7530, 1024, 0666);

    // (2) to Approach to target shmat
    shm_addr = shmat(shm_id, (void *)0, 0);

    // (3) Copy memory memcpy
    memcpy(buf, shm_addr, 1024);
    printf("Content : %s\n", buf);

    // (4) dettach shmdt
    shmdt(shm_addr);

    return 0;
}

 

 

프로그램 코드 작성시 작은 단위로 하나씩 만들어 나가야한다.

한 번에 다 만들려고 하지 말고 작은 단위 하나를 구현시키고

하나씩 확장해 나가면 된다.

 

 

 

 

 

 

728x90

+ Recent posts