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 に怒られます。。