メッセージキュー
構造化されたメッセージ通信です。
「メッセージキュー」は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フィードバックを取得できます。ローカル設定は不要です。