코딩뚠뚠

message queue 란 본문

카테고리 없음

message queue 란

로디네로 2022. 10. 10. 22:41
반응형

https://www.cloudamqp.com/blog/what-is-message-queuing.html


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를 알아보도록 하자.

 

 

 

 

 

 

 

 

 

반응형