0Pricing
C Academy · レッスン

メッセージキュー

構造化されたメッセージ通信です。

「メッセージキュー」はCoddyKit上の無料C Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。

構造化メッセージング

メッセージキューを使うと、プロセス間で生のバイトストリームではなく、個別のメッセージを交換できます。カーネルがメッセージの境界を保持するため、1 回の send は必ず 1 回の receive に対応します。

メッセージとストリームの違い

パイプは境界が曖昧になるバイトストリームを配信します。一方、メッセージキューはまとまり全体を配信します。

  • 各 send は 1 つのメッセージです
  • 各 receive は 1 つのメッセージを返します
  • メッセージには優先度を設定できます

POSIX と System V のキュー

API には 2 種類あります。

  • 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(1 メッセージあたりの最大バイト数)を定義します。受信側のバッファは少なくとも 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時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。

「メッセージキュー」で何を学びますか?

構造化されたメッセージ通信です。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「メッセージキュー」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC Academyレッスンでコードを書いて実行できますか?

はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. パイプ
  2. 共有メモリ
  3. メッセージキュー
  4. シグナル
← C Academyに戻る