SystemV メッセージキュー
前回に続き、メッセージキューを用いたIPCプログラミング。
コマンドライン引数で受けた文字列をキューに追加するプログラムと、
それを取り出すプログラム。
2つの独立したプログラム(プロセス)が、ひとつのメッセージキューを通して、コミュニケーションしています。
defs.h
ftokに指定するpath nameの定義
メッセージ型の定義
#define QPATH "/tmp/msgq0225" typedef struct{ long mtype; char str[100]; }MSG;
enq.c
#include// ftok() #include // key_t #include // msg***() #include // O_CREATE #include // strcpy() #include "./defs.h" // QPATH, MSG /* コマンドライン引数に与えられた、文字列を * メッセージキューに追加する */ int main(int argc, char** argv){ MSG obj = { 1 }; int qid; if(argc != 2){ // error return 0; } // メッセージの準備 strcpy(obj.str, argv[1]); // メッセージキュー識別子の取得 qid = msgget(ftok(QPATH,1), O_CREAT | 0666); // メッセージキューへの追加 msgsnd(qid, &obj, sizeof(MSG)-sizeof(long), 0); return 0; }
deq.c
#include// ftok() #include // key_t #include // msg***() #include // O_CREATE #include //printf() #include "./defs.h" // QPATH, MSG /* メッセージキューからメッセージを取り出す */ int main(void){ MSG obj; int qid = msgget(ftok(QPATH,1), O_CREAT | 0666 ); // メッセージキューから取り出す msgrcv(qid, &obj, sizeof(MSG)-sizeof(long), 0, 0); printf("Received Message : %s\n",obj.str); return 0; }
実行結果
三回目の ./deq 実行では、もうメッセージキューにメッセージがないため、ブロックされます。
※ msgrcvの第5引数にIPC_NOWAITをしていすると、命令は即座に返ります。
$ ./enq Debian $ ./enq RedHat $ ./deq Received Message : Debian $ ./deq Received Message : RedHat $ ./deq
ftok( )によって得られる、key_tに関連付けられたメッセージキューがなければ
新規作成、なければ既存キューの識別子を返すことを意味する IPC_CREAT。
毎回、 IPC_CREATE と書いて、gcc に怒られます。。