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;
}