概要
System V メッセージキューは、Linuxにおけるプロセス間通信方法の一種で、メッセージ形式のデータをプロセス間でやり取りするのに使われます。
主に下記3つがあり、今回はメッセージキューについて扱います。
- メッセージキュー
- セマフォ
- 共有メモリ
今回はこのメッセージキューをシステムコールを用いて作成し、作成されたメッセージキューの確認方法について整理します。
msgget()システムコールによるSystem Vメッセージキューの作成
msgget()というシステムコールについて説明します。
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgget(key_t key, int msgflg);
keyに指定したIPCキーのメッセージキューを取得・作成します。
すでにキーが存在していたらそのキーのメッセージキューのIDを返します。
存在していなかったら新規作成して、その新規作成されたメッセージキューのIDを返します。
第1引数 メッセージキューのキー名を指定する IPCオブジェクトのキーを指定します。 一意なキーを作成するには、
sys/ipc.h
で定義されている IPC_PRIVATEを指定します。第2引数
- 作成するメッセージキューへ設定するパーミッションマスクを指定します。 次の操作フラグを OR演算により指定可能です。
- IPC_CREAT
- keyに対応するメッセージキューが存在しない場合に新規作成する。
- IPC_EXCL
- IPC_CREATと併用し、keyに対応するメッセージキューが既存の場合にEEXISTエラーを返す
msgget()を使用したメッセージキューの作成例
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/stat.h> #include <stdlib.h> int main(int argc, char *argv[]) { int msqid; // System Vメッセージキューの作成 既存の場合はそのメッセージキューIDを返す msqid = msgget(IPC_PRIVATE, IPC_CREAT); if (msqid == -1) { errExit("msgget"); } printf("%d\n", msqid); exit(EXIT_SUCCESS); }
これをコンパイルして、実行すると、作成されたメッセージキューIDを表示して終了します。
root@bca7d0e99ea7:/tlpi/svmsg# ./simple_svmsg_create 0 root@bca7d0e99ea7:/tlpi/svmsg# ./simple_svmsg_create 1 root@bca7d0e99ea7:/tlpi/svmsg# ./simple_svmsg_create 2
作成された System V メッセージキューの確認方法
前項でmsgget()を使用してメッセージキューを作成しました。
作成されたメッセージキューの一覧を確認するには ipcs
コマンドを実行します。
-q オプションを使うと、作成されたIPC関連のオブジェクトのうち、メッセージキューの一覧を表示できます。
root@bca7d0e99ea7:/tlpi/svmsg# ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages 0x00000000 0 root 0 0 0 0x00000000 1 root 0 0 0 0x00000000 2 root 0 0 0
このようにして、先ほど3回実行した分のメッセージキューが作成されていることを確認できました。