✒️ Linux Programming/with Oracle Virtual Box & Ubuntu

[Linux & Ubuntu] C 프로그래밍을 통한 공유 메모리 & 메시지 큐 사용 프로세스 구현 #1

A Lim Han 2023. 10. 5. 22:15

💮 C 프로그래밍을 통한 공유 메모리 & 메시지 큐 사용 프로세스 구현 #1

# 구현할 프로그램 개요

 

프로그램 번호 프로그램 1 프로그램 2 프로그램 3
수행 작업 1초 간격으로 1~10까지
값을 공유 메모리에
차례로 입력
루프를 돌며 공유 메모리
값을 읽어와
메시지 큐에 입력
루프를 돌며 대기 후
메시지 큐에 입력된 값
짝수만을 읽어와 출력

 


 

💮 C 언어를 통한 프로그램 #1 구현

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

#define SHM_KEY 1234

// 공유 메모리 구조체 정의
struct SharedMemory {
ㅤㅤint value;
};

int main() {
ㅤㅤ// 공유 메모리 생성 또는 연결
ㅤㅤint shmid = shmget(SHM_KEY, sizeof(struct SharedMemory), 0666 | IPC_CREAT);
ㅤㅤif (shmid == -1) {
ㅤㅤㅤㅤperror("shmget");
ㅤㅤㅤㅤexit(1);
ㅤㅤ}
ㅤㅤstruct SharedMemory *shm = (struct SharedMemory *)shmat(shmid, NULL, 0);
ㅤㅤif (shm == (struct SharedMemory *)(-1)) {
ㅤㅤㅤㅤperror("shmat");
ㅤㅤㅤㅤexit(1);
ㅤㅤ}

ㅤㅤprintf("Program 1 is running...\n");

ㅤㅤfor (int i = 1; i <= 10; i++) {
ㅤㅤㅤㅤusleep(1000000);  // 1초 대기
ㅤㅤㅤㅤshm->value = i;
ㅤㅤㅤㅤprintf("Program 1 wrote to shared memory: %d\n", i);
ㅤㅤ}

ㅤㅤ// 공유 메모리 해제
ㅤㅤshmdt(shm);

ㅤㅤreturn 0;
}

1.  프로그램 실행에 필요한 라이브러리 include

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

 

++ 각 Include 문 상세 설명

include 문 역할
stdio.h 표준 입출력 함수를 포함하는 헤더 파일
stdlib.h C 프로그래밍 언어에서 기본적인
유틸리티 함수들을 포함하는 헤더 파일
unistd.h 유닉스 및 리눅스 시스템에서 제공하는
시스템 호출을 포함하는 헤더 파일
sys/types.h 시스템 데이터 형식을 정의하는 헤더 파일
sys/ipc.h IPC(Inter-Process Communication) 기능을
사용하기 위해 필요한 헤더 파일
sys/shm.h 공유 메모리 세그먼트 제어 시
사용되는 헤더 파일

2.  공유 메모리를 식별하는 데 사용될 키 정의

#define SHM_KEY 1234

3.  공유 메모리에 저장될 데이터 구조 정의

struct SharedMemory {
ㅤㅤint value;
};

4.  공유 메모리 선정 기능 구현

int main() {
ㅤㅤ// 공유 메모리 생성 또는 연결
ㅤㅤint shmid = shmget(SHM_KEY, sizeof(struct SharedMemory), 0666 | IPC_CREAT);
ㅤㅤif (shmid == -1) {
ㅤㅤㅤㅤperror("shmget");
ㅤㅤㅤㅤexit(1);
ㅤㅤ}

 

++  상황별 메모리 선정

 

공유 메모리가 존재 X 공유 메모리 존재 O
새 공유 메모리 생성 기존의 공유 메모리에 연결

5.  공유 메모리를 프로세스의 메모리 영역에 첨부

struct SharedMemory *shm = (struct SharedMemory *)shmat(shmid, NULL, 0);
ㅤㅤif (shm == (struct SharedMemory *)(-1)) {
ㅤㅤㅤㅤperror("shmat");
ㅤㅤㅤㅤexit(1);
ㅤㅤ}

 

++ 위 코드가 필요한 이유?

프로그램이 4번 과정에서 선정된 공유 메모리에 접근할 수 있게 하기 위해

6.  공유 메모리에 데이터를 입력하기 위한 코드 구현

printf("Program 1 is running...\n");

ㅤㅤfor (int i = 1; i <= 10; i++) {
ㅤㅤㅤㅤusleep(1000000);  // 1초 대기
ㅤㅤㅤㅤshm->value = i;
ㅤㅤㅤㅤprintf("Program 1 wrote to shared memory: %d\n", i);
ㅤㅤ}

 

++  코드 설명 상세

코드 설명
printf("Program 1 is running...\n"); 프로그램이 실행 중임을 나타내는 메시지 출력
usleep(1000000); 1초 동안 프로그램을 일시 중지
shm->value = i; 공유 메모리에 값을 저장
printf("Program 1 wrote to shared memory: %d\n", i); 공유 메모리에 쓴 값을 출력

7.  공유 메모리 해제 후 프로그램 종료

ㅤㅤ// 공유 메모리 해제
ㅤㅤshmdt(shm);

ㅤㅤreturn 0;
}