카테고리 없음
message queue 란
로디네로
2022. 10. 10. 22:41
반응형
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를 알아보도록 하자.
끝
반응형