본문 바로가기
개발 업무(코딩)-개발자였을때 썼던..

c언어 리눅스(linux) shared memory 간단 예제

by 주용사 2023. 1. 8.
728x90

shm.c에서 shared memory를 생성하고 값을 넣는다.

client.c에서 shm에 있는 데이터를 출력한다.



shm.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <string.h>

typedef struct {
        int a;
        char b[10];
}Form;

// shm.c
int main()
{

        int shmid;
        void *shared_memory = (void *)0;

        Form* form;

        /* 공유메모리 공간을 만든다. */
        shmid = shmget((key_t)1234, sizeof(form), 0666|IPC_CREAT);
        if (shmid == -1)
        {
                perror("shmget failed : ");
                exit(0);
        }

        /* 공유메모리를 사용하기 위해 프로세스메모리에 붙인다. */
        shared_memory = shmat(shmid, (void *)0, 0);
        if (shared_memory == (void *)-1)
        {
                perror("shmat failed : ");
                exit(0);
        }

        form = (Form*)shared_memory; // 할당된 공유메모리에 데이터를 넣는다.

        form->a = 3;
        memcpy(form->b, "test", sizeof(form->b));

        return 0;
}

 

client.c

typedef struct {
        int a;
        char b[10];
}Form;

//client.c
int main()
{
        int shmid;

        void *shared_memory = (void *)0;

        Form *form;

        /* 공유메모리 공간을 만든다. */
        shmid = shmget((key_t)1234, sizeof(form), 0666|IPC_CREAT);
        if (shmid == -1)
        {
                perror("shmget failed : ");
                exit(0);
        }

        /* 공유메모리를 사용하기 위해 프로세스메모리에 붙인다. */
        shared_memory = shmat(shmid, (void *)0, 0);
        if (shared_memory == (void *)-1)
        {
                perror("shmat failed : ");
                exit(0);
        }

        form = (Form*)shared_memory; // shm에 있는 데이터를 받아오기 위해서//

        printf("shm data = %d, %s\n", form->a, form->b);

        return 0;
}

그외

shmctl(shmid, IPC_RMID, 0) 으로 shm 제거 가능



ipcs -m -> shm 상태 체크 가능 , -m옵션없어도 보임

ipcrm    -> shm 제거 가능



https://taesun1114.tistory.com/entry/%EA%B3%B5%EC%9C%A0%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%95%A8%EC%88%98-shmget-shmat-shmdt

https://www.joinc.co.kr/w/Site/system_programing/IPC/SharedMemory

728x90