【linux高度環境プログラミング学習ノート4】メッセージキュープロセス通信


メッセージキュー通信方式の利点
Unixの初期プロセス通信方式では、信号は限られたデータしか伝送できず、パイプはフォーマットのないメッセージストリームしか伝送できなかった.メッセージキューの通信方式は、この2つの通信方式の欠点を克服した.
 
二メッセージキューの定義
メッセージキューはメッセージのチェーンテーブルであり、メッセージをレコードと見なし、特定のフォーマットを持つことができます.プロセスは、メッセージ・キューに一定のルールに従って新しいメッセージを追加し、別のプロセスはメッセージ・キューからメッセージを読み出すことができます.
 
3つのメッセージ・キューのタイプ
現在、主に2種類のメッセージキュー、POSIXメッセージキュー、およびシステムVメッセージキューがある.システムVメッセージキューは現在大量に使用されている.
システムVメッセージキューは、カーネルが再起動または手動で削除された場合にのみ削除される.
メッセージキューのカーネル持続性は、各メッセージキューがシステム範囲内で一意のキー値に対応することを要求するため、メッセージキューの記述語を取得するには、メッセージキューのキー値を提供する必要があります.
 
四メッセージキュー通信の基本手順
1.ftok関数を使用してファイル名に対応するキー値を取得する.
2.msggetを使用して、キー値項目に対応するメッセージキュー記述語を取得する.
3.msgsnd関数を使用してメッセージキューにメッセージを送信する.
4.msgrcv関数を使用してメッセージキューからデータを読み出します.
注意:メッセージ・キューのデータの読み取りとパイプ内のデータの読み取りには、データが読み込まれた後、メッセージ・キューにメッセージが存在しないという共通点があります.
 
5つの例
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <unistd.h>
#include<string.h>

struct msg_buf
{
	int m_type;
	char data[255];
};

int main(int args, char *argv[])
{
	key_t key;
	int msgid;
	int ret;
	struct msg_buf msgbuf;
	
	key = ftok("/tmp/msg",'a');
	printf("key is %x
",key); msgid = msgget(key,IPC_CREAT|0666); if(msgid == -1) { printf("Creat error!
"); exit(1); } msgbuf.m_type = getpid(); strcpy(msgbuf.data,"Test Duan"); ret = msgsnd(msgid, &msgbuf, sizeof(msgbuf.data),IPC_NOWAIT); if(ret == -1) { printf("Msg send error!
"); exit(1); } memset(&msgbuf,0,sizeof(msgbuf)); ret = msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),getpid(),IPC_NOWAIT); if(ret == -1) { printf("Msg get error!
"); exit(1); } printf("recv msg is %s
",msgbuf.data); }

実行結果:
key is ffffffff recv msg is Test Duan