メッセージキュー メッセージキュー メッセージキューのシステム概要 メッセージキューの特徴と利用手順 メッセージキューの操作 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]; };
© Copyright 2025 ExpyDoc