1 / 12

メッセージキュー

メッセージキュー. メッセージキューのシステム概要 メッセージキューの特徴と利用手順 メッセージキューの操作 ipcs - IPC リソース情報の表示 ipcrm – IPC の各資源(メッセージキュー・セマフォ集合・共有メモリ ID )を削除する メッセージキューの削除 メッセージ送信プログラム メッセージ受信プログラム msgget システムコール msgget システムコール msgrcv システムコール. メッセージキューのシステム概要. プロセス A と B は、 同じ鍵を持っている. プロセス A と B は、 同じ鍵を持っている.

diata
Download Presentation

メッセージキュー

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. メッセージキュー • メッセージキューのシステム概要 • メッセージキューの特徴と利用手順 • メッセージキューの操作 • ipcs - IPC リソース情報の表示 • ipcrm – IPCの各資源(メッセージキュー・セマフォ集合・共有メモリ ID)を削除する • メッセージキューの削除 • メッセージ送信プログラム • メッセージ受信プログラム • msggetシステムコール • msggetシステムコール • msgrcvシステムコール

  2. メッセージキューのシステム概要 プロセスAとBは、 同じ鍵を持っている プロセスAとBは、 同じ鍵を持っている メッセージ通信を使うプロセス共通のキー プロセス A プロセス B プロセスA msgget(); msgsnd(); プロセスB msgget(); msgrcv(); プロセス間通信 • パイプライン • シグナル • 共有メモリ カーネル • メッセージ通信 • セマフォ • ソケット メッセージキュー カーネル

  3. メッセージ通信によるプロセス間通信の特徴 メッセージ通信は、プロセス間通信にプロセスの親子関係が不要 パイプラインは親子プロセスのみ メッセージ送信の手順 msggetメッセージキューを生成し、その識別子を得る msgsndメッセージの構造体(struct msgbuf)を用いてメッセージを送信する メッセージ受信の手順 msgget受信したいメッセージが入っているメッセージキューの識別子を得る msgrcv メッセージの構造体(struct msgbuf)を用いてメッセージを受信する メッセージ送受信で利用するメッセージの構造体 struct msgbuf { long mtypes; char mtext[MSG_SIZ]; }; メッセージキューの特徴と利用手順

  4. メッセージキューの操作 $ 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つ

  5. ipcs は、IPC リソース機能に関する情報を出力する。 -i を指定すると、後続の idで指定されたリソースの情報だけが出力される。 リソースの指定は次のようになる: -m シェアードメモリセグメントを指定する。 -q メッセージキューを指定する。 -s セマフォを指定する。 -a すべてのリソースの情報が出力される(ディフォルト)。 出力フォーマットの指定は、次のようになる: -t リソースが最後に変更された時間を出力する。 -p リソースの所有、作成、最終変更を示すプロセスIDを出力する。 -c リソースの作成ユーザーおよびグループの情報を出力する。 -l 各リソースの上限値を出力する。 -u 各リソースの使用状況を示すサマリが出力される. ipcs - IPC リソース情報の表示

  6. 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)を削除する

  7. メッセージキューの削除 $ ipcs -q ------ メッセージキュー -------- キー msqid 所有者 権限 使用バイト数 メッセージ 0x61018097 98304 oida 666 0 0 $ ipcrm msg 98304 リソースを削除しました $ ipcs -q ------ メッセージキュー -------- キー msqid 所有者 権限 使用バイト数 メッセージ $ メッセージが 空になった msgid

  8. メッセージ送信プログラム msend.c キーを作成 メッセージ識別子を得る メッセージを送信

  9. メッセージ受信プログラム mrecv.c メッセージ識別子を得る キーを作成 メッセージを受信 mtypeにプロセスIDが入っている

  10. 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);

  11. 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]; };

  12. 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]; };

More Related