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