안녕하세요 마블랑입니다.
리눅스 우분투에서 사용할수 있는 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;
}
리눅스 상세에서 프로세스 간에 데이터를 주고 받을때 어떻게 할지몰라 찾아보고 공부를 해봤습니다.
지금은 간단하게 구현을 해두었는데 구조체를 이용하면 많은 데이터를 공유할수 있을듯 합니다.
이상 마블랑이었습니다.
읽어주셔서 고맙습니다.
'개발 이야기 > 리눅스 이야기' 카테고리의 다른 글
[C] char array to int, char array to double (0) | 2019.06.24 |
---|---|
Linux Ubuntu C 정적 라이브러리 생성하여 사용하기 (0) | 2019.06.21 |
리눅스 매개변수를 활용하여 데이터베이스에 데이터 입력하기 (0) | 2019.05.01 |
리눅스 C 명령인수 매개변수 argv 형변환 (0) | 2019.05.01 |
리눅스 C ODBC 데이터베이스 연동 SQLBindParameter Insert 예제(linux C ODBC example, unixodbc) (0) | 2019.05.01 |
댓글