はじめに
以前、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>