プログラミングサンプル:メッセージキュー

はじめに

以前、UNIXの機能をテストするために、サンプルプログラムを作成して動作確認していました。その時のプログラムをサンプルとして記載します。

この投稿では、UNIXのプロセス間通信(IPC;Inter-Process Communication)などに使用されるメッセージキュー(Message Queue)機能のプログラミングサンプルを掲載します。

少し情報が古いので、現状とは合わないかもしれないので注意してください。

send.c

/*==============================================*/
/*                                              */
/*  メッセージキュー送信モデル                  */
/*                                              */
/*==============================================*/

/*========================*/
/*  インクルードファイル  */
/*========================*/
#include	<stdio.h>
#include	<sys/types.h>
#include	<sys/ipc.h>
#include	<sys/msg.h>

/*==========*/
/*  define  */
/*==========*/
#define MSGKEY  7      		/*  メッセージキー    */
#define	MSGSIZE	100		/*  メッセージサイズ  */
#define	MSGTYPE	1		/*  メッセージタイプ  */
/*  メッセージ        */
#define	MESSAGE	"This is a test for message-queue"

/*==============*/
/*  メイン関数  */
/*==============*/
main(argc,argv)
int	argc;
char	**argv;
{

/*------------*/
/*  変数定義  */
/*------------*/
int	msgid,				/*  メッセージID      */
	msgget();

struct	msgbuf	{			/*  メッセージ構造体    */
		long	mtype;		/*  メッセージタイプ    */
		char	mtext[MSGSIZE];	/*  メッセージテキスト  */
	};
struct	msgbuf	message;		/*  メッセージ          */

int     s_len,          		/*  送信メッセージ長    */
	msgsnd();

/*--------------------------------------*/
/*  メッセージキュー用パラメータの設定  */
/*--------------------------------------*/
message.mtype = (long)MSGTYPE;	/*  メッセージタイプの設定    */
strcpy(message.mtext,MESSAGE);	/*  メッセージテキストの設定  */

/*------------------------------*/
/*  メッセージキューIDの獲得  */
/*------------------------------*/
fprintf(stderr,"msgget start\n");

if((msgid = msgget((key_t)MSGKEY,IPC_CREAT | 0666)) < 0){
	perror("msgget");
	exit(-1);
}

fprintf(stderr,"msgid = %d\n",msgid);
fprintf(stderr,"msgget end\n");
fprintf(stderr,"\n");

/*--------------------*/
/*  メッセージの送信  */
/*--------------------*/
fprintf(stderr,"msgsnd start\n");

if(msgsnd(msgid,&message,sizeof(message.mtext),IPC_NOWAIT) < 0){
	perror("msgsnd");
	exit(-1);
}

printf("send data = %d byte(s)\n",sizeof(message.mtext));
printf("send data = [%s]\n",message.mtext);
fprintf(stderr,"msgsnd end\n");
}

recieve.c

/*==============================================*/
/*                                              */
/*  メッセージキュー受信モデル                  */
/*                                              */
/*==============================================*/

/*========================*/
/*  インクルードファイル  */
/*========================*/
#include	<stdio.h>
#include	<sys/types.h>
#include	<sys/ipc.h>
#include	<sys/msg.h>

/*==========*/
/*  define  */
/*==========*/
#define	MSGKEY	7	/*  メッセージキー    */
#define	MSGSIZE	100	/*  メッセージサイズ  */
#define MSGTYPE 1       /*  メッセージタイプ  */

/*==============*/
/*  メイン関数  */
/*==============*/
main(argc,argv)
int	argc;
char	**argv;
{

/*------------*/
/*  変数定義  */
/*------------*/
int	msgid,				/*  メッセージID      */
	msgget();

struct	msgbuf	{			/*  メッセージ構造体    */
		long	mtype;		/*  メッセージタイプ    */
		char	mtext[MSGSIZE];	/*  メッセージテキスト  */
	};
struct	msgbuf	message;		/*  メッセージ          */

int	r_len,				/*  受信メッセージ長    */
	msgrcv();

/*------------------------------*/
/*  メッセージキューIDの獲得  */
/*------------------------------*/
fprintf(stderr,"msgget start\n");

if((msgid = msgget((key_t)MSGKEY,IPC_CREAT | 0666)) < 0){
	perror("msgget");
	exit(-1);
}

fprintf(stderr,"msgid = %d\n",msgid);
fprintf(stderr,"msgget end\n");
fprintf(stderr,"\n");

/*--------------------*/
/*  メッセージの受信  */
/*--------------------*/
fprintf(stderr,"msgrcv start\n");

if((r_len = msgrcv(msgid,&message,sizeof(message),(long)MSGTYPE,IPC_NOWAIT)) < 0){
	perror("msgrcv");
	exit(-1);
}

printf("recieve data = %d byte(s)\n",r_len);
printf("recieve data = [%s]\n",message.mtext);
fprintf(stderr,"msgrcv end\n");
fprintf(stderr,"\n");

/*--------------------------*/
/*  メッセージキューの削除  */
/*--------------------------*/
fprintf(stderr,"remove-message-queue start\n");

if(msgctl(msgid,IPC_RMID,NULL) < 0){
	perror("msgctl");
	exit(-1);
}

fprintf(stderr,"remove-message-queue end\n");
}

実行結果

<user@machine> send
msgget start
msgid = 720896
msgget end

msgsnd start
send data = 100 byte(s)
send data = [This is a test for message-queue]
msgsnd end

<user@machine> recieve
msgget start
msgid = 720896
msgget end

msgrcv start
recieve data = 100 byte(s)
recieve data = [This is a test for message-queue]
msgrcv end

remove-message-queue start
remove-message-queue end

<user@machine>