Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 삼성역테
- 코테
- sort
- tflite
- 포스코 ai 교육
- 코테 문제
- 딥러닝
- DP문제
- 다이나믹프로그래밍
- 코딩테스트
- bfs문제
- dfs
- tinyml
- DP
- TensorFlow Lite
- 자료구조
- 임베디드 딥러닝
- 삼성코딩테스트
- 초소형머신러닝
- 삼성역량테스트
- dfs문제
- 삼성코테
- MCU 딥러닝
- 영상처리
- 알고리즘
- 포스코 AI교육
- 포스코 교육
- 컴퓨팅사고
- 그리디
- BFS
Archives
- Today
- Total
코딩뚠뚠
message queue 란 본문
반응형
message queue는 IPC 방법중 하나이다
- IPC : Inter process communication 으로 프로세스 간 통신을 말한다.
종류는 아래와 같다.
- file
- pipe
- message queue
- shared memory
- signal
- socket
이 중 이번에는 message queue를 공부해보려한다.
message queue
말 그대로 queue를 사용해 메시지를 주고받는다.
queue의 특징인 FIFO 방식 그대로이지만, 타입에 따라 특정 메시지를 먼저 수신할 수도 있다.
특징 :
비동기적으로 전송하여 효율적이다
queue가 어딘가에 저장되어있어 버퍼의 역할을 한다.
그 어딘가는 kernel level단이고, 프로세스가 종료되어도 남아있다.
구현 :
헤더 :
#include <sys/msg.h>
#include <sys/ipc.h>
#include <sys/types.h>
시스템콜 :
Create message :
int msgget (key_t key, int msgflg);
Send Message :
int msgsnd (int msqid, struct msgbuf * msgp, size_t msgsize, int msgflg);
Receive Message :
ssize_t msgrcv(int msgid, struct msgbuf * msgp, size_t msgsize, long msgtype, int msgflg);
Control Message :
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
예제코드 :
구성 - send.c / receive.c
1. send.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define BUFFER_SIZE 1024
// 메시지 버퍼의 구조
typedef struct {
long msgtype;
int value;
char buf[BUFFER_SIZE];
} msgbuf;
int main() {
int cnt = 0;
int key_id; // 메시지큐 ID
msgbuf msg;
msg.msgtype = 1;
// 메시지 생성
key_id = msgget((key_t) 1234, IPC_CREAT|0666);
if (key_id == -1) {
printf("Message Get Failed!\n");
exit(0);
}
while (1) {
msg.value = ++cnt;
if (cnt >= 10) {
printf("메시지 전송 성공\n");
break;
}
// 메시지 전송, IPC_NOWAIT : queue공간없으면 fail처리
if (msgsnd(key_id, &msg, sizeof(msg), IPC_NOWAIT) == -1) {
printf("메시지 전송 실패\n");
exit(0);
}
printf("value: %d\n", msg.value);
sleep(1);
}
exit(0);
}
2. receive.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define BUFFER_SIZE 1024
typedef struct {
long msgtype;
int value;
char buf[BUFFER_SIZE];
} msgbuf;
int main() {
int key_id;
msgbuf msg;
msg.msgtype = 1;
// 메시지 생성
key_id = msgget((key_t) 1234, IPC_CREAT|0666);
if (key_id == -1) {
printf("Message Get Failed!\n");
exit(0);
}
while (1) {
// 메시지타입은 1이다.
if (msgrcv(key_id, &msg, sizeof(msg), 1, 0) == -1) {
printf("메시지 수신 실패\n");
exit(0);
}
printf("value: %d\n", msg.value);
}
printf("메시지 수신 성공\n");
exit(0);
}
위와 같은 방법으로 간단히 프로세스간 통신이 가능하다.
다음번엔 다른 IPC 방법인 shared memory를 알아보도록 하자.
끝
반응형