ネットワークプログラミング講座

メッセージキュー
メッセージキュー











メッセージキューのシステム概要
メッセージキューの特徴と利用手順
メッセージキューの操作
ipcs - IPC リソース情報の表示
ipcrm – IPCの各資源(メッセージキュー・セマフォ集合・共有メモリ ID)
を削除する
メッセージキューの削除
メッセージ送信プログラム
メッセージ受信プログラム
msggetシステムコール
msggetシステムコール
msgrcvシステムコール
メッセージキュー
メッセージキューのシステム概要
メッセージ通信を使うプロセス共通のキー
プロセス
A
プロセス
B
プロセス間通信
プロセスAとBは、
同じ鍵を持っている
プロセスA
プロセスB
msgget();
msgget();
msgsnd();
msgrcv();
•パイプライン
•シグナル
•共有メモリ
•メッセージ通信
•セマフォ
•ソケット
カーネル
メッセージキュー
カーネル
メッセージキュー
メッセージキューの特徴と利用手順

メッセージ通信によるプロセス間通信の特徴

メッセージ通信は、プロセス間通信にプロセスの親子関係が不要

パイプラインは親子プロセスのみ

メッセージ送信の手順

msgget メッセージキューを生成し、その識別子を得る

msgsnd メッセージの構造体(struct msgbuf)を用いてメッセージを
送信する
メッセージ受信の手順

msgget 受信したいメッセージが入っているメッセージキューの識別
子を得る

msgrcv メッセージの構造体(struct msgbuf)を用いてメッセージを
受信する
メッセージ送受信で利用するメッセージの構造体
struct msgbuf {
long mtypes;
char mtext[MSG_SIZ];
};


メッセージキュー
メッセージキューの操作
$ ipcs -q
------ メッセージキュー -------キー
msqid
所有者
権限
$ ./msend
Enter message: aaaa
$ ./msend
Enter message: kkkkkkk
$ ipcs -q
------ メッセージキュー -------キー
msqid
所有者 権限
0x61018097 98304
oida
666
$ ./mrecv
message received from 1825
aaaa
message received from 1826
kkkkkkkk
使用バイト数 メッセージ
使用バイト数 メッセージ
512
2
未読メッセージ2
つ
メッセージキュー
ipcs - IPC リソース情報の表示
ipcs は、IPC リソース機能に関する情報を出力する。

-i を指定すると、後続の id で指定されたリソースの情報だけが出
力される。
リソースの指定は次のようになる:

-m シェアードメモリセグメントを指定する。

-q メッセージキューを指定する。

-s セマフォを指定する。

-a すべてのリソースの情報が出力される(ディフォルト)。
出力フォーマットの指定は、次のようになる:

-t リソースが最後に変更された時間を出力する。

-p リソースの所有、作成、最終変更を示すプロセスIDを出力する。

-c リソースの作成ユーザーおよびグループの情報を出力する。

-l 各リソースの上限値を出力する。

-u 各リソースの使用状況を示すサマリが出力される.
メッセージキュー
ipcrm – IPCの各資源(メッセージキュー・
セマフォ集合・共有メモリ ID)を削除する

ipcrm は System V プロセス間通信 (interprocess communication, IPC) オブジェ
クトと、それに関連するデータ構造をシステムから削除する。









これらのオブジェクトを削除するためには、スーパーユーザーであるか、オブ
ジェクトの作成者または所有者でなければならない。
メッセージキューオブジェクトとセマフォオブジェクトの削除は、 (他のプロセス
がそのオブジェクトの IPC 識別子を持っていたとしても) 即座に行われる。
共有メモリオブジェクトが削除されるのは、現在付加 (attach) されている全て
のプロセスが (shmdt(2) で) 仮想アドレス空間からオブジェクトを分離
(detach) してからである。
-M shmkey
最後の分離が行われた後、 shmkey で作成された共有メモリセ
グメントを削除する。
-m shmid
最後の分離が行われた後、 shmid で識別される共有メモリセグ
メントを削除する。
-Q msgkey
msgkey で作成されたメッセージキューを削除する。
-q msgid
msgid で識別されるメッセージキューを削除する。
-S semkey
semkey で作成されたセマフォを削除する。
-s semid
semid で識別されるセマフォを削除する。
メッセージキュー
メッセージキューの削除
$ ipcs -q
------ メッセージキュー -------キー
msqid
所有者 権限
0x61018097 98304
oida
666
$ ipcrm msg 98304
リソースを削除しました
$ ipcs -q
msgid
------ メッセージキュー -------キー
msqid
所有者
権限
$
使用バイト数 メッセージ
0
0
メッセージが
空になった
使用バイト数 メッセージ
メッセージキュー
メッセージ送信プログラム
msend.c
キーを作成
メッセージ識別子を得る
メッセージを送信
メッセージキュー
メッセージ受信プログラム
mrecv.c
キーを作成
メッセージ識別子を得る
メッセージを受信
mtypeにプロセス
IDが入っている
メッセージキュー
msggetシステムコール
msgget メッセージキューを生成し、識別子を得る
インクルードファイル
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
書式
int msgget(key_t key, int msgflg);
戻値
成功時 キュー識別子、 失敗時 -1
msgflg:

IPC_CREATE | 0666
使用例)
msgkey = ftok("mrecv",'a');
msgid = msgget(msgkey,IPC_CREAT|0666);
メッセージキュー
msggetシステムコール
msgsnd メッセージを送信する
インクルードファイル
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
書式 int msgsnd(int msgid, struct
msgbuf *msgp, size_t msgsz, int
msgflg);
戻値
成功時 0、 失敗時 -1
使用例)
struct msgbuf msgdata, *p;
p=&msgdata;
p->mtype=getpid();
msgkey=ftok("mrecv",'a');
msgid=msgget(msgkey,IPC_CREAT|0666);
msgsnd(msgid,p,sizeof(p->mtext),0);
msgflg:
メッセージの構造体
struct msgbuf {
long mtypes;
char mtext[MSG_SIZ];
};


IPC_NOWAIT: メッセージ
キューが一杯になった場合、
エラーを返す
上記以外:メッセージキュー
が一杯になった場合、空き
が出来るまで待つ
メッセージキュー
msgrcvシステムコール
msgrcv メッセージを受信する
インクルードファイル
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
書式 ssize_t msgrcv(int msgid, struct
msgbuf *msgp, size_t msgsz, long
msgtyp, int msgflg);
戻値
成功時 mtext配列にコ
ピーしたバイト数
失敗時 -1
使用例)
struct msgbuf msgdata, *p;
p=&msgdata;
p->mtype=getpid();
msgkey=ftok("mrecv",'a');
msgid=msgget(msgkey,IPC_CREAT|0666);
rv = msgrcv(msgid,p,sizeof(p->mtext),0,0);
メッセージの構造体
struct msgbuf {
long mtypes;
char mtext[MSG_SIZ];
};