๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœ’๏ธ Linux Programming/with Oracle Virtual Box & Ubuntu

[Linux & Ubuntu] C ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ & ๋ฉ”์‹œ์ง€ ํ ์‚ฌ์šฉ ํ”„๋กœ์„ธ์Šค ๊ตฌํ˜„ #3

by A Lim Han 2023. 10. 11.

๐Ÿฉฐ C ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ & ๋ฉ”์‹œ์ง€ ํ ์‚ฌ์šฉ ํ”„๋กœ์„ธ์Šค ๊ตฌํ˜„ # 3

# ๊ตฌํ˜„ํ•  ํ”„๋กœ๊ทธ๋žจ ๊ฐœ์š”

ํ”„๋กœ๊ทธ๋žจ ๋ฒˆํ˜ธ ํ”„๋กœ๊ทธ๋žจ 1 ํ”„๋กœ๊ทธ๋žจ 2 ํ”„๋กœ๊ทธ๋žจ 3
์ˆ˜ํ–‰ ์ž‘์—… 1์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ 1~10๊นŒ์ง€
๊ฐ’์„ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์—
์ฐจ๋ก€๋กœ ์ž…๋ ฅ
๋ฃจํ”„๋ฅผ ๋Œ๋ฉฐ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ
๊ฐ’์„ ์ฝ์–ด์™€
๋ฉ”์‹œ์ง€ ํ์— ์ž…๋ ฅ
๋ฃจํ”„๋ฅผ ๋Œ๋ฉฐ ๋Œ€๊ธฐ ํ›„
๋ฉ”์‹œ์ง€ ํ์— ์ž…๋ ฅ๋œ ๊ฐ’
์ค‘ ์ง์ˆ˜๋งŒ์„ ์ฝ์–ด์™€ ์ถœ๋ ฅ

 


๐Ÿ’ฎ C ์–ธ์–ด๋ฅผ ํ†ตํ•œ ํ”„๋กœ๊ทธ๋žจ # 3 ๊ตฌํ˜„

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

#define MSG_KEY 5678

// ๋ฉ”์‹œ์ง€ ํ ๊ตฌ์กฐ์ฒด ์ •์˜
struct Message {
ใ…คใ…คlong mtype;
ใ…คใ…คint data;
};

int main() {
ใ…คใ…ค// ๋ฉ”์‹œ์ง€ ํ ์—ฐ๊ฒฐ
ใ…คใ…คint msqid = msgget(MSG_KEY, 0666);
ใ…คใ…คif (msqid == -1) {
ใ…คใ…คใ…คใ…คperror("msgget");
ใ…คใ…คใ…คใ…คexit(1);
ใ…คใ…ค}

ใ…คใ…คprintf("Program 3 is running...\n");

ใ…คใ…คint received_count = 0;
ใ…คใ…คwhile (received_count < 5) {
ใ…คใ…คใ…คใ…คstruct Message message;
ใ…คใ…คใ…คใ…คmsgrcv(msqid, &message, sizeof(int), 1, 0);  // ๋ฉ”์‹œ์ง€ ํƒ€์ž… 1์ธ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ 
ใ…คใ…คใ…คใ…คif (message.data % 2 == 0) {
ใ…คใ…คใ…คใ…คใ…คใ…คprintf("Program 3 received even value from message queue: %d\n", message.data);
ใ…คใ…คใ…คใ…คใ…คใ…คreceived_count++;
ใ…คใ…คใ…คใ…ค}
ใ…คใ…ค}

ใ…คใ…ค// ๋ฉ”์‹œ์ง€ ํ ์‚ญ์ œํ•˜์ง€ ์•Š์Œ

ใ…คใ…คprintf("Program 3 finished.\n");

ใ…คใ…คreturn 0;
}

1.  ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ include

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

 

++ ๊ฐ Include ๋ฌธ ์ƒ์„ธ ์„ค๋ช…

include ๋ฌธ ์—ญํ• 
stdio.h ํ‘œ์ค€ ์ž…์ถœ๋ ฅ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ํ—ค๋” ํŒŒ์ผ
stdlib.h C ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๊ธฐ๋ณธ์ ์ธ
์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋“ค์„ ํฌํ•จํ•˜๋Š” ํ—ค๋” ํŒŒ์ผ
unistd.h ์œ ๋‹‰์Šค ๋ฐ ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณตํ•˜๋Š”
์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํฌํ•จํ•˜๋Š” ํ—ค๋” ํŒŒ์ผ
sys/types.h ์‹œ์Šคํ…œ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ •์˜ํ•˜๋Š” ํ—ค๋” ํŒŒ์ผ
sys/ipc.h IPC(Inter-Process Communication) ๊ธฐ๋Šฅ์„
์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํ—ค๋” ํŒŒ์ผ
sys/msg.h ์‹œ์Šคํ…œ V IPC ๋ฉ”์‹œ์ง€ ํ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ํ—ค๋” ํŒŒ์ผ

2.  ๋ฉ”์‹œ์ง€ ํ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ํ‚ค ์ •์˜

#define MSG_KEY 5678

3.  ๋ฉ”์‹œ์ง€ ํ์—์„œ ๊ตํ™˜๋˜๋Š” ๋ฉ”์‹œ์ง€ ํ˜•์‹์„ ์ •์˜

// ๋ฉ”์‹œ์ง€ ํ ๊ตฌ์กฐ์ฒด ์ •์˜
struct Message {
ใ…คใ…คlong mtype;
ใ…คใ…คint data;
};

4.  ๋ฉ”์‹œ์ง€ ํ ์—ฐ๊ฒฐ

int main() {
ใ…คใ…ค// ๋ฉ”์‹œ์ง€ ํ ์—ฐ๊ฒฐ
ใ…คใ…คint msqid = msgget(MSG_KEY, 0666);
ใ…คใ…คif (msqid == -1) {
ใ…คใ…คใ…คใ…คperror("msgget");
ใ…คใ…คใ…คใ…คexit(1);
ใ…คใ…ค}

 

++  ์ฝ”๋“œ ์„ค๋ช… ์ƒ์„ธ

์ฝ”๋“œ ์„ค๋ช…
msgget(MSG_KEY, 0666) MSG_KEY ๋งคํฌ๋กœ ์ •์˜ ํ›„ ๋ฉ”์‹œ์ง€ ํ ์—ฐ๊ฒฐ
perror("msgget") ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ
exit(1) ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ

5.  5๊ฐœ์˜ ์ง์ˆ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•  ๋•Œ๊นŒ์ง€ while ๋ฃจํ”„ ์‹คํ–‰

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

ใ…คใ…คint received_count = 0;
ใ…คใ…คwhile (received_count < 5) {
ใ…คใ…คใ…คใ…คstruct Message message;
ใ…คใ…คใ…คใ…คmsgrcv(msqid, &message, sizeof(int), 1, 0);  // ๋ฉ”์‹œ์ง€ ํƒ€์ž… 1์ธ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ 
ใ…คใ…คใ…คใ…คif (message.data % 2 == 0) {
ใ…คใ…คใ…คใ…คใ…คใ…คprintf("Program 3 received even value from message queue: %d\n", message.data);
ใ…คใ…คใ…คใ…คใ…คใ…คreceived_count++;
ใ…คใ…คใ…คใ…ค}
ใ…คใ…ค}

 

++  ์ฝ”๋“œ ์„ค๋ช… ์ƒ์„ธ

์ฝ”๋“œ ์„ค๋ช…
received_count ๋ฐ›์€ ๋ฉ”์‹œ์ง€ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜
while (received_count < 5) ์ง์ˆ˜ ๋ฉ”์‹œ์ง€ 5๊ฐœ ์ˆ˜์‹  ์‹œ ์ข…๋ฃŒ
msgrcv(msqid, &message, sizeof(int), 1, 0) ๋ฉ”์‹œ์ง€ ํ์—์„œ ์œ ํ˜•์ด 1์ธ
์ง์ˆ˜ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ 

6.  ๋ฉ”์‹œ์ง€ ํ๋ฅผ ๋ณด์กดํ•œ ์ƒํƒœ์—์„œ ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ

// ๋ฉ”์‹œ์ง€ ํ ์‚ญ์ œํ•˜์ง€ ์•Š์Œ

ใ…คใ…คprintf("Program 3 finished.\n");

ใ…คใ…คreturn 0;
}