0Pricing
C Academy · 강의

메시지 큐

구조화된 메시징을 알아봅니다

메시지 큐은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

구조화된 메시징

메시지 큐를 사용하면 프로세스가 원시 바이트 스트림이 아니라 개별 메시지를 교환할 수 있습니다. 커널이 메시지 경계를 유지하므로 전송 한 번은 정확히 수신 한 번에 대응합니다.

메시지와 스트림 비교

파이프는 경계가 모호해지는 바이트 스트림을 전달합니다. 메시지 큐는 완전한 단위로 전달합니다.

  • 각 send는 하나의 메시지입니다
  • 각 receive는 하나의 메시지를 반환합니다
  • 메시지에 우선순위를 지정할 수 있습니다

POSIX와 System V 큐

API는 두 가지가 있습니다.

  • POSIX: mq_open, mq_send, mq_receive를 사용하며 슬래시가 포함된 이름을 사용합니다
  • System V: msgget, msgsnd, msgrcv를 사용하며 타입이 지정된 메시지를 키 기반으로 처리합니다

POSIX가 더 깔끔하고 현대적인 선택입니다.

큐 열기

mq_open은 이름 있는 큐를 만들거나 열고 디스크립터를 반환합니다. 최대 메시지 수와 크기 같은 속성을 전달할 수 있습니다.

#include <mqueue.h>
#include <fcntl.h>

mqd_t open_queue(const char *name) {
    return mq_open(name, O_CREAT | O_RDWR, 0644, NULL);
    /* name like "/myqueue"; NULL uses default attributes */
}

큐 속성

struct mq_attr는 mq_maxmsg(용량)와 mq_msgsize(메시지당 최대 바이트 수)를 정의합니다. 수신 측 버퍼는 mq_msgsize 이상이어야 합니다.

#include <mqueue.h>

void set_attr(struct mq_attr *a) {
    a->mq_flags = 0;
    a->mq_maxmsg = 10;     /* up to 10 queued messages */
    a->mq_msgsize = 256;   /* each at most 256 bytes */
    a->mq_curmsgs = 0;
}

메시지 보내기

mq_send는 우선순위와 함께 메시지를 큐에 넣습니다. 우선순위가 높은 메시지가 먼저 전달됩니다.

#include <mqueue.h>
#include <string.h>

int post(mqd_t q, const char *text) {
    return mq_send(q, text, strlen(text) + 1, 5); /* priority 5 */
}

메시지 받기

mq_receive는 우선순위가 가장 높은 메시지를 반환합니다. 버퍼가 mq_msgsize보다 작으면 호출이 EMSGSIZE와 함께 실패합니다.

#include <mqueue.h>
#include <stdio.h>

void get(mqd_t q, size_t msgsize) {
    char buf[256];
    unsigned prio;
    ssize_t n = mq_receive(q, buf, msgsize, &prio);
    if (n >= 0) printf("got (prio %u): %s\n", prio, buf);
}

우선순위에 따른 전달 순서

FIFO 파이프와 달리 메시지 큐는 먼저 우선순위를 기준으로 전달하고, 같은 우선순위에서는 도착 순서를 따릅니다. 따라서 긴급한 메시지가 앞쪽으로 이동할 수 있습니다.

차단 방식과 비차단 방식

기본적으로 큐가 가득 차면 mq_send가 차단되고, 큐가 비어 있으면 mq_receive가 차단됩니다. O_NONBLOCK으로 열면 기다리는 대신 EAGAIN을 반환합니다.

시간 제한 작업

mq_timedsend와 mq_timedreceive는 절대 기한을 받으며, 작업이 제때 완료되지 않으면 ETIMEDOUT과 함께 실패합니다. 따라서 무한히 기다리는 일을 피할 수 있습니다.

정리

mq_close로 디스크립터를 닫고, 모든 사용자가 작업을 마친 후에도 남지 않도록 mq_unlink로 시스템에서 이름 있는 큐를 제거하십시오.

#include <mqueue.h>

void cleanup(mqd_t q, const char *name) {
    mq_close(q);
    mq_unlink(name); /* remove the named queue */
}

빠른 확인

메시지 큐에 대한 이해도를 확인해 보십시오.

복습

POSIX 메시지 큐를 배웠습니다.

  • 원시 바이트가 아니라 개별 메시지를 교환합니다
  • mq_open, mq_send, mq_receive를 사용합니다
  • 우선순위에 따라 전달한 다음 도착 순서를 따릅니다
  • 비차단 및 시간 제한 변형을 선택적으로 사용할 수 있으며 mq_close와 mq_unlink로 정리합니다

자주 묻는 질문

“메시지 큐” 강의는 무료인가요?

네 — “메시지 큐” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“메시지 큐”에서 뭘 배우나요?

구조화된 메시징을 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“메시지 큐” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 파이프
  2. 공유 메모리
  3. 메시지 큐
  4. 시그널
← C Academy(으)로 돌아가기