프로그래밍/ExampleCode.com

[IPC] shared memory 예제 코드

jinkwon.kim 2018. 9. 20. 23:56
728x90
반응형

[IPC] shared memory 예제 코드


1. 구조

  - 커널에서 제공하는 메모리를 이용한 프로세스가 데이터를 공유하는 구조이다. 

  - 자세한 설명은 다음 포스트 참조 

   [프로세스간 통신] IPC(inter process communication) 종류


2. 예제 코드

  (1) Header 

#ifndef __SHARE_MEMORY_H__
#define __SHARE_MEMORY_H__

#define SHM_INFO_COUNT 30

typedef struct _shm_info{
	char         str_ip[40];
	unsigned int int_ip;
	unsigned int int_id;
}SHM_INFOS;
#endif//__SHARE_MEMORY_H__

  (2) shared Memory Writing 코드 

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <string.h> 
#include <unistd.h> 
#include "share_memory.h"

int main()
{
	int shmid;
	int i;
	SHM_INFOS *shm_info= NULL;
	void *shared_memory = (void *)0;


	// 공유메모리 공간을 만든다.
	shmid = shmget((key_t)3836, sizeof(SHM_INFOS)*SHM_INFO_COUNT, 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);
	}

	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;
		}
	}
}


  (3) shared Memory View 코드


#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <string.h> 
#include <unistd.h> 
#include "share_memory.h"

int main()
{
	int shmid;
	int i;
	SHM_INFOS *shm_info= NULL;

	void *shared_memory = (void *)0;

// 공유메모리 공간을 만든다.
	shmid = shmget((key_t)3836, sizeof(SHM_INFOS)*SHM_INFO_COUNT, 0666|IPC_CREAT);

	if (shmid == -1)
	{
		perror("shmget failed : ");
		exit(0);
	}

	shared_memory = shmat(shmid, (void *)0, 0666|IPC_CREAT);
	if (shared_memory == (void *)-1)
	{
		perror("shmat attach is failed : ");
		exit(0);
	}
	shm_info = (SHM_INFOS *)shared_memory;

	while(1)
	{
		for( i = 0; i < SHM_INFO_COUNT ; i++){
			fprintf(stderr,"---------- [ %d ] shared info ---------\n",i);
			fprintf(stderr,"String IP[%s]\n",shm_info[i].str_ip);
			fprintf(stderr,"String IP[%u]\n",shm_info[i].int_ip);
			fprintf(stderr,"String IP[%u]\n",shm_info[i].int_id);
		}
		sleep(1);
	}
}

  (4) shared Memory Clear 코드



#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <string.h> 
#include <unistd.h>  
#include "share_memory.h"

int main()
{
	int shmid;

	// 공유메모리 공간을 만든다.
	shmid = shmget((key_t)3836, sizeof(SHM_INFOS)*SHM_INFO_COUNT, 0666|IPC_CREAT);

	if (shmid == -1)
	{
		perror("shmget failed : ");
		exit(0);
	}

	if ( -1 == shmctl( shmid, IPC_RMID, 0))
	{
		printf( "공유 메모리 제거 실패\n");
		return -1;
	}
	else
	{
		printf( "공유 메모리 제거 성공\n");
	}
	return 0;

}


728x90
반응형