kakts-log

programming について調べたことを整理していきます

SystemV メッセージキューの作成とipcsを用いたメッセージキューの確認方法

概要

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回実行した分のメッセージキューが作成されていることを確認できました。