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