POSIXメッセージキューサンプルコード
ポイント
msgget: メッセージキューを作成する。keyは次のftokで作成する。
ftok: メッセージキュー作成のキーを生成する。
msgsnd: メッセージ送信。実際は指定したメッセージキューにエンキューする。
msgrcv: メッセージ受信。実際は指定したメッセージキューからデキューする。
msgctl: メッセージキューの操作をする。キュー破壊に使っている。
サンプルコード
メッセージキューを作り、メッセージを送り、自分で受け取る。
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { long mtype; char data[256]; } T_Msg; int main(int argc, char **argv) { key_t key; int msgQueue; T_Msg sndData = {1, "hello"}; T_Msg rcvData = {0}; /* キュー作成 */ key = ftok("./msgque", 'Z'); msgQueue = msgget(key, IPC_CREAT | IPC_EXCL | 0666); if (msgQueue == -1) { msgQueue = msgget(key, IPC_EXCL | 0666); if (msgQueue == -1) { perror("msgget"); return -1; } } /* メッセージ送信 */ if (msgsnd(msgQueue, &sndData, sizeof(sndData.data), 0)) { perror("msgsnd"); return -1; } sndData.mtype = 2; strcpy(sndData.data, "2-1 hello"); msgsnd(msgQueue, &sndData, sizeof(sndData.data), 0); sndData.mtype = 2; strcpy(sndData.data, "2-2 hello"); msgsnd(msgQueue, &sndData, sizeof(sndData.data), 0); sndData.mtype = 3; strcpy(sndData.data, "3 hello"); msgsnd(msgQueue, &sndData, sizeof(sndData.data), 0); /* メッセージ受信 */ if (msgrcv(msgQueue, &rcvData, sizeof(rcvData.data), 0, IPC_NOWAIT) == -1) { perror("msgrcv: "); return -1; } printf("recieve: %s\n", rcvData.data); memset(&rcvData, 0, sizeof(rcvData)); if (msgrcv(msgQueue, &rcvData, sizeof(rcvData.data), 3, IPC_NOWAIT) == -1) { perror("msgrcv: "); return -1; } printf("recieve: %s\n", rcvData.data); memset(&rcvData, 0, sizeof(rcvData)); if (msgrcv(msgQueue, &rcvData, sizeof(rcvData.data), 1, IPC_NOWAIT) == -1) { perror("msgrcv: "); return -1; } printf("recieve: %s\n", rcvData.data); memset(&rcvData, 0, sizeof(rcvData)); if (msgrcv(msgQueue, &rcvData, sizeof(rcvData.data), 2, IPC_NOWAIT) == -1) { perror("msgrcv: "); return -1; } printf("recieve: %s\n", rcvData.data); /* メッセージキュー破壊 */ msgctl(msgQueue, IPC_RMID, NULL); return 0; }