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