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