Cygwinでメッセージキュー使用

今日は、でびあんはお休み。
その代わりに、Cygwinで IPCプログラミングを試みる。

メッセージをSendするプログラムと
メッセージをRecvするプログラムの簡単なもの。

def.h

メッセージキューキー取得のための、ftokに取得するパスの定義、
メッセージキューに貯めるメッセージ型の定義。
第一メンバは、メッセージタイプを示す long型である必要あり。

#define QPATH "/tmp/msgq123"

typedef struct{
	long mtype;
	char str[100];
}MSG;

producer.c

メッセージキューの作成、
メッセージの追加を行う。

msgget時に IPC_CREAT | 0666 を指定することで、
既存のキューがない場合、アクセス許可レベルが0666( 全員読み書きOK )であるキューを新規作成する。

#include 
#include 
#include 
#include 
#include "def.h"

int main(void){
	int qid = msgget(ftok(QPATH,1), IPC_CREAT | 0666);
	MSG obj = { 1, "Saturday end" };
	puts("Message Send...");
	msgsnd(qid, &obj, sizeof(MSG)-sizeof(long), 0);
	strcpy(obj.str, "Sunday Start!!");
	puts("Message Send...");
	msgsnd(qid, &obj, sizeof(MSG)-sizeof(long), 0);

	return 0;
}

consumer.c

メッセージの取得を行う。
このプログラム実行前に、キューの作成が行われていることが前提。
※ msggetに IPC_CREATを指定していないため。

#include 
#include 
#include 
#include 
#include "def.h"

int main(void){
	MSG obj;
	int qid = msgget( ftok(QPATH,1), 0 );
	for(;;){
		puts("Message Receiving...");
		msgrcv(qid, &obj, sizeof(MSG)-sizeof(long), 0, 0);
		printf("Received Msg : %s\n", obj.str);
	}
	return 0;
}


で、これを Cygwinで実行するためには、

環境変数 CYGWIN に、 server を指定し、
あらかじめ、 /usr/sbin/cygserver.exe を実行しておく必要があります。
※メッセージキューの概念は、単独のプログラムにとどまるものでなく、なんらかのバックグラウンドで動作するプログラムが必要であるため。

これをやっておかないと、
Bad system call  エラーとなります。




ちなみに、今回のプログラムで、
char str[100] = "Hello";
ができても、
str = "Hello";
ができないことに気づきました・・・

いまさら・・・(--;





参考にさせていただいたサイト:
http://asistobe851.hp.infoseek.co.jp/my-memo/mq.html
http://www.sixnine.net/cygwin/translation/cygwin-ug-net/using-cygwinenv.html