メッセージ操作

ほかのマイクロスクリプトで記述したプロセスや、C言語で記述したプロセスとの間で、メッセージを送受信できます。

メッセージは0~7の8種類のタイプに分類され、用途に応じて使い分けることができます。

∇プロセスIDの取得

プロセスにメッセージを送信するには、そのプロセスのIDを知る必要があります。プロセスIDは、以下のようにして取得します。

VOPEN文で起動したプロセス:〈セグメント名〉.PID

PROCESS文で起動したプロセス:起動時に得られたプロセスID

その他のプロセス:

相手のプロセスが、一意的なグローバル名で登録したプロセスIDを、組み込み手続きgetgnm()により取り出します。

逆にほかのプロセスに自分のプロセスIDを通知したい場合は、組み込み手続きsetgnm()により、自分のプロセスID(システム変数$PID)を登録しておく必要があります。

∇C言語で記述したプロセスとの通信

マイクロスクリプトで使用するメッセージタイプ(0~7)は、超漢字Vのメッセージタイプ“MS_TYPE0 ~ MS_TYPE7”に対応しています。そのため、C言語で記述したプロセスでも、“MS_TYPE0 ~ MS_TYPE7”を使用する必要があります。

送受信するメッセージは以下の構造となります。

#define MAX_MSG_SIZE 4096

typedef struct {

W msg_type; /* タイプ(MS_TYPE 0~7)*/

W msg_size; /* 本体サイズ */

W ext_size; /* 外部サイズ(120) */

UB body[MAX_MSG_SIZE]; /* 本体 */

} MS_MESG;

“body[]”がメッセージ本体を示し、その実際のサイズは“msg_size - sizeof(W)”となります。

MSEND 〈プロセスID式〉,〈タイプ式〉,〈サイズ式〉,〈配列変数〉

指定したプロセスに対して、メッセージを送信します。

〈プロセスID式〉

送信するメッセージの送信先のプロセスIDを示す式です。

〈タイプ式〉

送信するメッセージのタイプ(0~7)を示す式です。

〈サイズ式〉

送信するメッセージ本体のバイトサイズを示す式です。送信可能なメッセージのサイズは最大4Kバイトです。

〈配列変数〉

送信するメッセージの本体を格納した配列変数です。〈サイズ式〉で指定したバイト数の要素がなくてはいけません。配列変数の型は任意です。ただし、〈サイズ式〉はバイト数で指定するため、変数が占めるバイト数に注意する必要があります。配列変数の代わりに部分配列も指定することができ、その場合は指定した〈先頭要素〉から〈要素数〉だけが対象となります。

部分配列:〈配列変数名〉[〈先頭要素〉:〈要素数〉]

例:
VARIABLE msg:C[100]
VOPEN サブプロセス
MSEND サブプロセス.PID,0,100*2,msg

MRECV 〈マスク式〉,〈プロセスID変数〉,〈タイプ変数〉,〈サイズ変数〉,〈配列変数〉【:〈タイムアウト式〉】

指定したタイプのメッセージを受信します。受信の対象となるメッセージは、あらかじめシステム変数$MMASKにより指定しておかなくてはなりません。

〈マスク式〉

受信するメッセージのタイプを示すビットマスクを示す式です。

0x01:タイプ0に対応
0x02:タイプ1に対応
0x04:タイプ2に対応
0x08:タイプ3に対応
0x10:タイプ4に対応
0x20:タイプ5に対応
0x40:タイプ6に対応
0x80:タイプ7に対応

〈プロセスID変数〉:

受信したメッセージの送信元のプロセスIDを格納する変数です。

〈タイプ変数〉

受信したメッセージのタイプ(0~7)を格納する変数です。

〈サイズ変数〉

受信したメッセージの本体のバイトサイズを格納する変数です。

〈配列変数〉

受信したメッセージの本体を格納する配列変数です。配列変数の型は任意です。ただし、変数が占めるバイト数に注意する必要があります。配列変数の代わりに部分配列も指定することができ、その場合は指定した〈先頭要素〉から〈要素数〉だけが対象となります。

部分配列:〈配列変数名〉[〈先頭要素〉:〈要素数〉]

受信したメッセージのサイズが配列変数のサイズより大きい場合は、配列変数のサイズ分だけが格納され、残りは廃棄されます。そのため、十分大きなサイズの配列を指定する必要があります。

〈タイムアウト式〉:

メッセージを受信するための最大待ち時間を示す式です。秒単位で0~86400(24時間)の範囲で指定します。省略した場合は永久に待ちます。

例:
VARIABLE msg:C[100]
VARIABLE pid,mtyp,msz
SET $MMASK=0x80
# メッセージタイプ7のみ
MRECV 0x80,pid,mtyp,msz,msg

前のページへプロセスの生成 次のページへ実身操作

ページの先頭へ戻る

HOME > サポート情報 > 取扱説明書 > メッセージ操作