โœ’๏ธ 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;
}