본문 바로가기
개발 이야기/리눅스 이야기

Linux Ubuntu C 공유메모리 사용예제

by 런던살자 2019. 6. 21.

안녕하세요 마블랑입니다.

 

리눅스 우분투에서 사용할수 있는 C언어로 구현한 공유메모리 예제를 공유합니다.

 

하나씩 공부를 하며 구현을 했기 때문에 자세한 설명은 못하더라도 바로 사용할수 있게끔 에러처리를 해두었습니다 ^^

 

먼저 예제 프로세스를 설명하겠습니다. 

 

왼쪽화면에서 메시지를 입력하여 공유메모리에 저장합니다.

 

그러면 오른쪽 프로세스가 매 1초당 공유메모리에 접근하여 데이터를 불러온 다음에 화면에 표시해주는 역활을 하고 있습니다. 

 

다음은 코드를 살펴보겠습니다.

 

왼쪽 프로세스인 공유메모리 메인이라는 프로세스 입니다.

 

 

1. 공유메모리 메인 

 

공유메모리의 ID를 생성하고 공유메모리의 버퍼를 할당합니다.

 

그 뒤에 반복문을 통해서 공유메모리에 저장할 데이터를 입력받습니다. 'quit'을 입력하면 반복문이 종료되고 공유메모리를 해제합니다. 

 

공유메모리를 해제할때 할당한 버퍼를 해제한뒤에 공유메모리를 삭제합니다.

 

이 부분은 메인과 뷰 둘중 하나만 해도 되기 때문에 메인 부분에 구현 해두었습니다.

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

void main( void)
{
	int   nShmId;
	void *pShmSendBuffer;

	nShmId = shmget((key_t)9999, 1024, IPC_CREAT | 0666);

	if (-1 == nShmId) 
	{
		printf("Shared Memory Create Failed...\n");
		return;
	}

	pShmSendBuffer = shmat(nShmId, NULL, 0);
	if(pShmSendBuffer == (void *) -1){
		printf("Shared Memory Buffer Create Failed...\n");
		return;
	}

	while(1)
	{
		char SendMsg[1023];
		scanf("%s", &SendMsg);
		sprintf((char *)pShmSendBuffer, "%s", SendMsg);

		if(!strcmp(SendMsg,"quit")){
			printf("Quit!\n");
			break;
		}
	}

	if (-1 != shmdt( pShmSendBuffer))
		printf("Shared Memory Release Success!\n");
	else
		printf("Shared Memory Release Failed..\n");

	if ( -1 != shmctl( nShmId, IPC_RMID, 0))
		printf( "Shared Memory Delete Success!\n");
	else
		printf( "Shared Memory Delete Failed..\n");

	return;
}

 

 

2. 공유메모리 뷰

 

메인으로부터 받은 데이터를 화면에 표시합니다. 

 

공유메모리의 생성과 해제는 동일하지만 반복문에 Sleep을 통해 매초마다 데이터를 불러오고 있습니다.

 

역시 메인에서 'quit' 을 보내면 반복문이 끝나고 공유메모리 해제를 합니다.

 

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

void main( void)
{
	int   nShmId;
	void *pShmSendBuffer;

	nShmId = shmget((key_t)9999, 1024, IPC_CREAT | 0666);

	if (-1 == nShmId) 
	{
		printf( "Shared Memory Create Failed...\n");
		return;
	}

	pShmSendBuffer = shmat(nShmId, NULL, 0);
	if(pShmSendBuffer == (void *) -1){
		printf( "Shared Memory Buffer Create Failed...\n");
		return;
	}

	while(1)
	{
		printf("%s\n", (char *)pShmSendBuffer);   

		if(!strcmp(pShmSendBuffer,"quit")){
			printf("Quit!\n");
			break;
		}
		sleep(1);
	}

	if (-1 != shmdt( pShmSendBuffer))
		 printf("Shared Memory Release Success!\n");
	else
		 printf("Shared Memory Release Failed..\n");

	return;
}

 

리눅스 상세에서 프로세스 간에 데이터를 주고 받을때 어떻게 할지몰라 찾아보고 공부를 해봤습니다.

 

지금은 간단하게 구현을 해두었는데 구조체를 이용하면 많은 데이터를 공유할수 있을듯 합니다.

 

 

이상 마블랑이었습니다.

 

읽어주셔서 고맙습니다.

댓글