프로그래밍 언어/C_C++

[예제] IPC - Shared Memory 사용 예제

투칼론 2016. 5. 20. 00:24
반응형

1. 공유 메모리(Share Memory) 개념

프로세스들간의 데이터를 공유하거나, 데이터를 전달할 때 이용되는 IPC(Inter-Process Communication) 자원이다.


2. 공유 메모리(Share Memory) 관련 주요 함수


1) 헤더 파일

#include <sys/types.h>

#include <sys/ipc.h> 

#include <sys/shm.h> 


2) 주요 함수 목록


  • shmget() 공유 메모리 생성 함수

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

* key : Shared Memory key (유일해야 함)

* size : Shared Memory 크기

* shmflg

   - IPC_CREAT : 기존 key에 해당하는 공유메모리가 없으면 신규로 생성하고, | 연산자를 붙여 접근권한을 준다.(아래 예제 참조)

   - IPC_EXCL : 기존 key에 해당하는 공유메모리가 있으면 실패로 반환


[반환값]

-1 : 실패 시

ID : 성공 시 ID 값 반환


  • shmat() - 공유 메모리 접근하기 위한 attach 하는 함수
  • shmdt() - 공유 메모리에서 detach 하는 함수
  • shmctl() - 공유 메모리 제어하기 위한 함수

3. 예제


shm_server 프로그램이 공유메모리를 통해 a ~ z 문자 데이터를 shm_client에 공유하는 예제이다.

[shm_server.c]

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <stdio.h>


#define SHMSZ  30


main()

{

        char c;

        int  shmid;

        key_t key;

        char *shm, *s;


        key=9778;


        if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {

                perror("shmget");

                exit(1);

        }


        if ((shm = shmat(shmid, NULL, 0)) == (char*) -1) {

                perror("shmat");

                exit(1);

        }


        s = shm;


        for (c='a';c<'z';c++)

                *s++=c;

        *s=NULL;


        while (*shm != '*')

                sleep(1);


        exit(0);

}


[shm_client.c]

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <stdio.h>


#define SHMSZ  30


main()

{

        int  shmid;

        key_t key;

        char *shm, *s;


        key=9778;


        if ((shmid = shmget(key, SHMSZ, 0666)) < 0) {

                perror("shmget");

                exit(1);

        }


        if ((shm = shmat(shmid, NULL, 0)) == (char*) -1) {

                perror("shmat");

                exit(1);

        }


        for (s=shm;*s != NULL;s++)

                putchar(*s);

        putchar('\n');


        *shm = '*';


        exit(0);

}