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