ほかのマイクロスクリプトで記述したプロセスや、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)”となります。
指定したプロセスに対して、メッセージを送信します。
〈プロセスID式〉
送信するメッセージの送信先のプロセスIDを示す式です。
〈タイプ式〉
送信するメッセージのタイプ(0~7)を示す式です。
〈サイズ式〉
送信するメッセージ本体のバイトサイズを示す式です。送信可能なメッセージのサイズは最大4Kバイトです。
〈配列変数〉
送信するメッセージの本体を格納した配列変数です。〈サイズ式〉で指定したバイト数の要素がなくてはいけません。配列変数の型は任意です。ただし、〈サイズ式〉はバイト数で指定するため、変数が占めるバイト数に注意する必要があります。配列変数の代わりに部分配列も指定することができ、その場合は指定した〈先頭要素〉から〈要素数〉だけが対象となります。
部分配列:〈配列変数名〉[〈先頭要素〉:〈要素数〉]
例:
VARIABLE msg:C[100]
VOPEN サブプロセス
MSEND サブプロセス.PID,0,100*2,msg
指定したタイプのメッセージを受信します。受信の対象となるメッセージは、あらかじめシステム変数$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