プロセスにはメッセージキューが付属しており、 このメッセージキューを経由してプロセス間メッセージ通信が行なわれる。 この機能は、プロセス間でのアプリケーションメッセージの通信だけではなく、 子プロセスの終了メッセージ等のシステムでの用途にも使用される。 このため、いくつかのメッセージの形式はシステムで定義されている。
メッセージは、プロセスに付属しているメッセージキューに送られ、 送信先はそのプロセス ID により指定される。 また送信元も送信プロセスのプロセス ID により識別される。
1 つのメッセージは以下の構造を持ち、msg_type により 1 〜 31 の 31 種のタイプに分けられている。
さらに各タイプにビット対応したタイプマスクにより、
メッセージの受信 / クリアにおいて、対象とするメッセージのタイプ ( 複数 )
を指定できるようになっている。
typedef union {
struct {
W pid;
W code;
} ABORT; /* プロセスの異常終了メッセージ */
struct {
W pid;
W code;
} EXIT; /* プロセスの正常終了メッセージ */
struct {
W pid;
W code;
} TERM; /* プロセスの強制終了メッセージ */
struct {
W code;
} TMOUT; /* タイムアウトメッセージ */
struct {
W code;
} SYSEVT; /* システムイベントメッセージ */
struct {
UB msg_str[32];
} ANYMSG; /* その他一般 */
} MSGBODY;
typedef struct message {
W msg_type; /* メッセージタイプ */
W msg_size; /* メッセージ本体サイズ(バイト) */
MSGBODY msg_body; /* メッセージ本体 */
} MESSAGE;
プロセスのメッセージキューには他プロセスからのメッセージ以外にも自プロセスから送信したメッセージも ( 送信先が自プロセスの場合 ) 入り、 この種のメッセージとしてはタイムアウトメッセージがある。 なお、子プロセスが終了した場合の終了メッセージもこのメッセージキューに入る。
メッセージキューは FIFO であり、必ず送信順に入れられる。 送信時に相手のメッセージキューがフルの場合は、 キューに空きができるまで待つか、エラーリターンするかを指定できる。
通常は、受信したメッセージはメッセージキューに蓄えられ、 メッセージの受信要求により取り出すが、 メッセージハンドラを定義することにより、 指定したタイプのメッセージを受信した場合に、 非同期な処理を行なうことが可能である。 これは一種の割り込み処理として使用される。
メッセージは 1 〜 31 のタイプ番号により 31 種のタイプに分類され、 そのうち 1 〜 はシステムでその用途が規定されており、 6 〜 23 がシステム予約で、システム及び外殻により用途が規定される。 残りの 24 〜 31 がアプリケーションで使用可能となっている。
メッセージタイプは以下のように定義される。
#define MS_ABORT ( 1) /* プロセス異常終了 */
#define MS_EXIT ( 2) /* プロセス正常終了 */
#define MS_TERM ( 3) /* プロセス強制終了 */
#define MS_TMOUT ( 4) /* タイムアウト */
#define MS_SYSEVT ( 5) /* システムイベント(強制終了) */
#define MS_SYS1 ( 6) /* システム予約 */
#define MS_SYS2 ( 7) /* システム予約 */
#define MS_SYS3 ( 8) /* システム予約 */
#define MS_SYS4 ( 9) /* システム予約 */
#define MS_SYS5 (10) /* システム予約 */
#define MS_MNG0 (11) /* 外殻予約 */
#define MS_MNG1 (12) /* 外殻予約 */
#define MS_MNG2 (13) /* 外殻予約 */
#define MS_MNG3 (14) /* 外殻予約 */
#define MS_MNG4 (15) /* 外殻予約 */
#define MS_MNG5 (16) /* 外殻予約 */
#define MS_MNG6 (17) /* 外殻予約 */
#define MS_MNG7 (18) /* 外殻予約 */
#define MS_MNG8 (19) /* 外殻予約 */
#define MS_MNG9 (20) /* 外殻予約 */
#define MS_MNG10 (21) /* 外殻予約 */
#define MS_MNG11 (22) /* 外殻予約 */
#define MS_MNG12 (23) /* 外殻予約 */
#define MS_TYPE0 (24) /* アプリケーションメッセージ */
#define MS_TYPE1 (25)
#define MS_TYPE2 (26)
#define MS_TYPE3 (27)
#define MS_TYPE4 (28)
#define MS_TYPE5 (29)
#define MS_TYPE6 (30)
#define MS_TYPE7 (31)
#define MS_MIN ( 1) /* 最小メッセージタイプ */
#define MS_MAX (31) /* 最大メッセージタイプ */
各メッセージタイプにはビット対応のタイプマスクが対応づけられており、 タイプマスクの OR のパターンにより、 対象とするメッセージのタイプを複数指定することができる。
メッセージタイプマスクは以下のように定義される。
#define MSGMASK(msgtype) (1 << ((msgtype) - 1))
#define MM_ABORT MSGMASK(MS_ABORT) /* プロセス異常終了 */
#define MM_EXIT MSGMASK(MS_EXIT) /* プロセス正常終了 */
#define MM_TERM MSGMASK(MS_TERM) /* プロセスの強制終了 */
#define MM_TMOUT MSGMASK(MS_TMOUT) /* タイムアウト */
#define MM_SYSEVT MSGMASK(MS_SYSEVT) /* システムイベント(強制終了) */
#define MM_SYS1 MSGMASK(MS_SYS1) /* システム予約 */
#define MM_SYS2 MSGMASK(MS_SYS2) /* システム予約 */
#define MM_SYS3 MSGMASK(MS_SYS3) /* システム予約 */
#define MM_SYS4 MSGMASK(MS_SYS4) /* システム予約 */
#define MM_SYS5 MSGMASK(MS_SYS5) /* システム予約 */
#define MM_MNG0 MSGMASK(MS_MNG0) /* 外殻予約 */
#define MM_MNG1 MSGMASK(MS_MNG1) /* 外殻予約 */
#define MM_MNG2 MSGMASK(MS_MNG2) /* 外殻予約 */
#define MM_MNG3 MSGMASK(MS_MNG3) /* 外殻予約 */
#define MM_MNG4 MSGMASK(MS_MNG4) /* 外殻予約 */
#define MM_MNG5 MSGMASK(MS_MNG5) /* 外殻予約 */
#define MM_MNG6 MSGMASK(MS_MNG6) /* 外殻予約 */
#define MM_MNG7 MSGMASK(MS_MNG7) /* 外殻予約 */
#define MM_MNG8 MSGMASK(MS_MNG8) /* 外殻予約 */
#define MM_MNG9 MSGMASK(MS_MNG9) /* 外殻予約 */
#define MM_MNG10 MSGMASK(MS_MNG10) /* 外殻予約 */
#define MM_MNG11 MSGMASK(MS_MNG11) /* 外殻予約 */
#define MM_MNG12 MSGMASK(MS_MNG12) /* 外殻予約 */
#define MM_TYPE0 MSGMASK(MS_TYPE0) /* アプリケーションメッセージ */
#define MM_TYPE1 MSGMASK(MS_TYPE1)
#define MM_TYPE2 MSGMASK(MS_TYPE2)
#define MM_TYPE3 MSGMASK(MS_TYPE3)
#define MM_TYPE4 MSGMASK(MS_TYPE4)
#define MM_TYPE5 MSGMASK(MS_TYPE5)
#define MM_TYPE6 MSGMASK(MS_TYPE6)
#define MM_TYPE7 MSGMASK(MS_TYPE7)
#define MM_ALL (0x7fffffff) /* 全マスク */
#define MM_NULL (0) /* 空マスク */
システムメッセージは、システムで自動的に発生するメッセージであり、 以下に示す内容となる。 これらは、基本的にメッセージキューのオーバーフローの影響を受けず、 捨てられることはないようになっている。 なお、1 〜 7 のメッセージタイプを持つメッセージをアプリケーションが送信することは特に禁止されていない。
MS_ABORT -- 子プロセスの異常終了メッセージ
プロセスがシステムエラーにより異常終了させられた場合に、 親プロセスに対して子プロセスより自動的に送信される以下の内容のメッセージである。
W 1 /* タイプ = MS_ABORT */
W 8 /* 本体のバイト数 */
W pid /* 終了した子プロセスのプロセス ID */
W code /* システムエラーコード */
code は発生したシステムエラーのコードであり、
MH_TERM メッセージハンドラによる異常終了の場合は、0 となる。
MS_EXIT -- 子プロセスの正常終了メッセージ
プロセスが ext_prc() システムコールにより正常終了した場合に、
親プロセスに対して子プロセスより自動的に送信される以下の内容のメッセージである。
W 2 /* タイプ = MS_EXIT */
W 8 /* 本体のバイト数 */
W pid /* 終了した子プロセスのプロセス ID */
W code /* ext_prc ()で指定した終了コード */
MS_TERM -- 子プロセスの強制終了メッセージ
プロセスが ter_prc() システムコールにより他から強制終了させられた場合に、
親プロセスに対して子プロセスより自動的に送信される以下の内容のメッセージである。
W 3 /* タイプ = MS_TERM */
W 8 /* 本体のバイト数 */
W pid /* 終了した子プロセスのプロセス ID */
W code /* ter_prc()で指定した終了コード */
MS_TMOUT -- 自プロセスのタイムアウトメッセージ
req_tmg() システムコールにより要求したタイムアウトメッセージであり、
指定した時間後に、自プロセスに対して自動的に送信される以下の内容のメッセージである。
W 4 /* タイプ = MS_TMOUT */
W 4 /* 本体のバイト数 */
W code /* req_tmg ()で指定したコード */
メッセージハンドラとは、 受信したメッセージを現在実行中の処理と非同期に処理するための関数であり、 メッセージのタイプと、対応する関数を指定することにより定義される。 従って、メッセージの各タイプに対応した最大 31 種のメッセージハンドラを同時に定義可能である。
メッセージハンドラは以下に示す形で起動されて実行される。
対応するタイプのメッセージを受信した場合、 メッセージハンドラは、メインタスクの現在の処理に割り込む形で実行される。
何らかのシステムコールによる待ち状態の時にメッセージが送信された場合にもメッセージハンドラは起動され、
そのプロセスのメインタスクが実行状態となる。
この場合、メインタスクが実行中の長い待ちを伴ったシステムコールは無条件に中断され、
その結果は保証されない。
即ち、メッセージハンドラが終了した時点で、
中断されたシステムコールは ER_MINTR のエラーとして戻る。
メッセージハンドラは通常のプロセスコードの一部として動作し、 実行できるシステムコール等の制限はない。
メッセージハンドラが終了した場合は、
通常、割り込まれた位置からそのメインタスクの実行が再開されるが、
メッセージハンドラから直接 longjmp () により、
そのメインタスクの任意の位置 ( setjmp で指定された位置 )
に実行を移行することも可能である。
メッセージハンドラはネスティングしない。 即ち、新たなメッセージハンドラの起動 ( 別のメッセージタイプのものも含む ) は、 現在処理中のメッセージハンドラの終了まで待たされる。
メッセージハンドラが起動された場合、 その起動の原因となったメッセージはメッセージキューから取り出され、 取り出されたメッセージのポインタがハンドラのパラメータとして渡される。
メッセージハンドラは、必ず ret_msg ()
システムコールによって終了しなくてはいけない。
メッセージハンドラは、以下に示す形の関数として定義される。
VOID msg_hdr(W pid, MESSAGE *r_msg)
{
/* pid は 送信したプロセスの ID 。(自プロセスの場合は 0) */
/* r_msg は受信したメッセージへのポインタである。 */
受信メッセージの処理
ret_msg (0); /* 終了 (割り込んだ位置に戻る場合) */
または
ret_msg (1); /* 終了 (任意の位置に移行する場合) */
longjmp (reent, code); /* reent へジャンプする */
}
特殊なメッセージハンドラとして以下のシステム定義のものが存在し、使用することができる。
MH_NONE :
何もせずに、メッセージは無視される。 この場合は、例外的に待ちを含むシステムコールは中断されない。 これは、単にある特定のタイプのメッセージをキューにも入れずに完全に無視するために使用される。
MH_BREAK :
何もせずに、メッセージは無視される。
この場合は、待ちを含むシステムコールは中断され、
ER_MINTR エラーが戻る。
これは、タイムアウト等の処理に使用される。
MH_TERM :
自プロセスを異常終了し、
MS_ABORT メッセージ
( エラーコードは 0 ) を親プロセスに送信する。
typedef union {
struct { /* MS_ABORT */
W pid;
W code;
} ABORT;
struct { /* MS_EXIT */
W pid;
W code;
} EXIT;
struct { /* MS_TERM */
W pid;
W code;
} TERM;
struct { /* MS_TMOUT */
W code;
} TMOUT;
struct { /* MS_SYSEVT */
W code;
} SYSEVT;
struct { /* その他一般 */
UB msg_str[32];
} ANYMSG;
} MSGBODY;
typedef struct message {
W msg_type; /* メッセージタイプ */
W msg_size; /* メッセージ本体サイズ(バイト) */
MSGBODY msg_body; /* メッセージ本体 */
} MESSAGE;
#define MSGSIZE(msgsz) (offsetof(MESSAGE,msg_body) + msgsz)
#define MS_ABORT ( 1) /* プロセス異常終了 */ #define MS_EXIT ( 2) /* プロセス正常終了 */ #define MS_TERM ( 3) /* プロセス強制終了 */ #define MS_TMOUT ( 4) /* タイムアウト */ #define MS_SYSEVT ( 5) /* システムイベント ( 強制終了 ) */ #define MS_SYS1 ( 6) /* システム予約 */ #define MS_SYS2 ( 7) /* システム予約 */ #define MS_SYS3 ( 8) /* システム予約 */ #define MS_SYS4 ( 9) /* システム予約 */ #define MS_SYS5 (10) /* システム予約 */ #define MS_MNG0 (11) /* 外殻予約 */ #define MS_MNG1 (12) /* 外殻予約 */ #define MS_MNG2 (13) /* 外殻予約 */ #define MS_MNG3 (14) /* 外殻予約 */ #define MS_MNG4 (15) /* 外殻予約 */ #define MS_MNG5 (16) /* 外殻予約 */ #define MS_MNG6 (17) /* 外殻予約 */ #define MS_MNG7 (18) /* 外殻予約 */ #define MS_MNG8 (19) /* 外殻予約 */ #define MS_MNG9 (20) /* 外殻予約 */ #define MS_MNG10 (21) /* 外殻予約 */ #define MS_MNG11 (22) /* 外殻予約 */ #define MS_MNG12 (23) /* 外殻予約 */ #define MS_TYPE0 (24) /* アプリケーションメッセージ */ #define MS_TYPE1 (25) #define MS_TYPE2 (26) #define MS_TYPE3 (27) #define MS_TYPE4 (28) #define MS_TYPE5 (29) #define MS_TYPE6 (30) #define MS_TYPE7 (31) #define MS_MIN ( 1) /* 最小メッセージタイプ */ #define MS_MAX (31) /* 最大メッセージタイプ */
#define MSGMASK(msgtype) (1 << ((msgtype) - 1)) #define MM_ABORT MSGMASK(MS_ABORT) #define MM_EXIT MSGMASK(MS_EXIT) #define MM_TERM MSGMASK(MS_TERM) #define MM_TMOUT MSGMASK(MS_TMOUT) #define MM_SYSEVT MSGMASK(MS_SYSEVT) #define MM_SYS1 MSGMASK(MS_SYS1) #define MM_SYS2 MSGMASK(MS_SYS2) #define MM_SYS3 MSGMASK(MS_SYS3) #define MM_SYS4 MSGMASK(MS_SYS4) #define MM_SYS5 MSGMASK(MS_SYS5) #define MM_MNG0 MSGMASK(MS_MNG0) #define MM_MNG1 MSGMASK(MS_MNG1) #define MM_MNG2 MSGMASK(MS_MNG2) #define MM_MNG3 MSGMASK(MS_MNG3) #define MM_MNG4 MSGMASK(MS_MNG4) #define MM_MNG5 MSGMASK(MS_MNG5) #define MM_MNG6 MSGMASK(MS_MNG6) #define MM_MNG7 MSGMASK(MS_MNG7) #define MM_MNG8 MSGMASK(MS_MNG8) #define MM_MNG9 MSGMASK(MS_MNG9) #define MM_MNG10 MSGMASK(MS_MNG10) #define MM_MNG11 MSGMASK(MS_MNG11) #define MM_MNG12 MSGMASK(MS_MNG12) #define MM_TYPE0 MSGMASK(MS_TYPE0) #define MM_TYPE1 MSGMASK(MS_TYPE1) #define MM_TYPE2 MSGMASK(MS_TYPE2) #define MM_TYPE3 MSGMASK(MS_TYPE3) #define MM_TYPE4 MSGMASK(MS_TYPE4) #define MM_TYPE5 MSGMASK(MS_TYPE5) #define MM_TYPE6 MSGMASK(MS_TYPE6) #define MM_TYPE7 MSGMASK(MS_TYPE7) #define MM_ALL (0x7fffffff) /* 全マスク */ #define MM_NULL (0) /* 空マスク */
#define WAIT 0x0000 /* 待つ */ #define NOWAIT 0x0001 /* 待たない */ #define CONFM 0x0002 /* 受信(確認)待ち */ #define CHECK 0x0002 /* メッセージチェック */ #define WAIEVT 0x0004 /* メッセージおよびイベント待ち */
#define MH_NONE ((FUNCP)1) /* 無視 */ #define MH_BREAK ((FUNCP)2) /* 処理中断 */ #define MH_TERM ((FUNCP)3) /* プロセス終了 */
|
ERR snd_msg(W pid, MESSAGE* msg, W opt)
W pid 送信先プロセス ID
> 0 任意のプロセス
= 0 自プロセス
=-1 親プロセス
MESSAGE* msg 送信メッセージ
W opt 送信待ち属性 ( NOWAIT ‖ WAIT ‖ CONFM )
NOWAIT :
メッセージを送信先プロセスのメッセージキューに入れた時点で正常終了する。 送信先のメッセージキューに空きがない時はエラー終了する。
WAIT :
メッセージを送信先プロセスのメッセージキューに入れた時点で正常終了する。 メッセージキューに空きがない時は空きができるまで待つ。 待っている間に送信先プロセスが終了した場合はエラー終了する。
CONFM :
メッセージを送信先プロセスのメッセージキューに入れ、 送信先プロセスが送信したメッセージを受信、 またはメッセージキューからクリアした時点で正常終了する。 それまで待つ。
rcv_msg() で CHECK
指定によりヘッダ部分のみを得た場合には、
受信したとみなされない。
NOCLR 指定により受信した場合は、
キューに残っていても受信したとみなされる。
待っている間に送信先プロセスが終了した場合はエラー終了する。
送信先が自プロセスの場合、CONFM 指定はエラーとなる。
=0 正常 <0 エラー(エラーコード)
pid で指定したプロセスにメッセージを送信する。
ER_ADR : アドレス(msg)のアクセスは許されていない。
ER_MINTR : メッセージハンドラが起動されたため待ち処理が中断された。
ER_NOPRC : プロセス(pid)は存在していない。
メッセージキューの空き待ち、または確認待ちの間に送信先のプロセスが終了した。
ER_NOSPC : システムのメモリ領域が不足した
(送信先のメッセージキューがフル(NOWAIT指定時))。
ER_PAR : パラメータが不正である(オプション,メッセージタイプが不正)。
ER_SELF : 自プロセスを指定した(pid = 0 または自プロセスのPID)(CONFM指定時)。
ER_SZOVR : メッセージ本体のサイズがシステムの制限を越えた、または0以下である。
|
WERR rcv_msg(W t_mask, MESSAGE* msg, W msgsz, W opt)
W t_mask 受信対象メッセージタイプマスク
MESSAGE* msg 受信メッセージ格納領域
W msgsz 受信メッセージ格納領域全体のバイトサイズ
メッセージのヘッダ部分も含むため msgsz ≧ 8でなくてはいけない。
W opt 受信属性 (WAIT ‖ NOWAIT ‖ WAIEVT) | (CLR ‖ NOCLR) | (CHECK)
WAIT :
指定タイプのメッセージを受信していない時は、メッセージが来るまで待つ。
NOWAIT :
指定タイプのメッセージを受信していない時は、エラー終了する。
WAIEVT :
指定タイプのメッセージを受信していない時は、 指定タイプのメッセージが来るか、イベント発生まで待つ。
CLR :
メッセージを受信した後はそのメッセージをキューから取り除く。
NOCLR :
メッセージを受信した後もそのメッセージをキューに残しておく。
CHECK
メッセージの有無をチェックする。
>0 正常(受信メッセージの送信元プロセス ID) =0 正常(受信メッセージの送信元は自プロセス) <0 エラー(エラーコード)
自プロセス宛の指定したタイプのメッセージを受信する。
受信したメッセージが指定した領域に入り切らない場合は、
msgsz の範囲内のみ
msg の領域に格納されてエラー終了する。
この時は、CLR 指定があってもメッセージはバッファに残る。
ただし、msgsz < 8 の時は msg
の領域には何も格納されない。
メッセージの全体が格納できなかった場合は、
格納されたメッセージのヘッダ部分から実際のメッセージサイズが判断できるので、
そのメッセージが格納可能な十分な大きさの領域を用意して再度本システムコールを実行することになる。
CHECK 指定の時は、
次のような動作になる。
メッセージが何も存在しない場合、WAIT または
WAIEVT 指定時は待ち、
NOWAIT 指定時はエラー終了する。
指定したタイプのメッセージが存在している場合は、
msg にメッセージを格納し正常終了する。
CLR 指定であればキューから取り除き、
NOCLR 指定であればキューに残す。
指定したタイプのメッセージが存在せず、
それ以外のメッセージが存在している場合は、
メッセージの先頭 8 バイト ( msg_type と msg_size )
のみを msg に格納し正常終了する。
この場合、CLR 指定があってもメッセージはキューに残す。
CHECK 指定の時は、
指定したタイプ以外のメッセージが得られる可能性があるため、
受信したメッセージのタイプを必ずチェックする必要がある。
WAIEVT を指定は基本的な動作は
WAIT 指定と同じであるが、
メッセージが受信されていなくても、
brk_msg() によりイベント発生が通知されると待ちが解除される。
この場合、エラー ( ER_NOME ) 終了する。
WAIEVT を指定した場合は、
t_mask = 0 が指定できる。
この場合、メッセージの受信は行われず、イベント発生が通知されるまで待つ。
WAIEVT を指定できるのは同時にはシステム全体で 1 つのタスクのみで、
複数のタスクが WAIEVT 指定で rcv_msg() を呼び出したときは、
最後に呼び出したタスクの
WAIEVT 指定のみが有効となる。
他のタスクは WAIT と同じ扱いとなる。
WAIEVT は外殻 ( ウインドウマネージャ ) の
wget_evt() の実現のために用意されたオプションである。
アプリケーションは WAIEVT を指定してはいけない。
ER_ADR : アドレス(msg)のアクセスは許されていない。
ER_MINTR : メッセージハンドラが起動されたため待ち処理が中断された。
ER_NONE : 指定したタイプ(t_mask)のメッセージは存在しない(NOWAIT指定時)。
ER_PAR : パラメータが不正である
(msgsz が小さすぎる、
WAIEVT指定時以外 t_mask≦0、WAIEVT指定時 t_mask<0)。
|
ERR clr_msg(W t_mask, W last_mask)
W t_mask クリア対象メッセージタイプマスク
= MM_ALL 全メッセージタイプ
W last_mask クリア終了メッセージタイプマスク
= MM_NULL 対象はメッセージキューの最後まで
= MM_ALL メッセージを1つだけクリア
=0 正常 <0 エラー(エラーコード)
自プロセス宛の指定したタイプの受信済みメッセージをクリアする。
自プロセスのメッセージキューに受信済みのメッセージのうち、
t_mask で指定したタイプのメッセージを
last_mask で指定したタイプのメッセージの直前までクリアする。
last_mask で指定したタイプのメッセージはクリアされないが、
last_mask = MM_ALL の時は、
特別にメッセージを 1 つだけクリアすることを意味する。
t_mask と last_mask の指定例を以下に示す。
| t_mask | last_mask | 動作 |
|---|---|---|
| MM_ALL | MM_NULL | 受信済みの全メッセージをクリア |
| − | MM_ALL | t_mask で指定したメッセージを 1 つだけクリア |
| MM_ALL | MM_ALL | 先頭のメッセージを1つだけクリア |
ER_PAR : パラメータが不正である(t_mask≦0、last_mask<0)。
|
ERR req_tmg(W time, W code)
W time メッセージ送信時間(ミリ秒) W code タイムアウトメッセージのコード
=0 正常 <0 エラー(エラーコード)
自プロセス宛に指定した時間後にタイムアウトメッセージ
( MS_TMOUT ) を送信することを要求する。
この機能は、 メッセージハンドラと組み合わせて特定の処理のタイムアウト監視などに使用される。
ER_NOSPC : システムのメモリ領域が不足した。 ER_PAR : パラメータが不正である(time≦0)。
|
ERR can_tmg()
なし
=0 正常
自プロセスのタイムアウトメッセージ要求をすべて取り消す。 タイムアウトメッセージ要求がない場合は何もしない。
すでに送信されてメッセージキューに入っているタイムアウトメッセージはクリアされない。
発生しない。
|
ERR def_msg(W t_mask, FP msghdr)
W t_mask 対象メッセージタイプマスク
FP msghdr メッセージハンドラ開始アドレス
= NULL メッセージハンドラの定義解除
= MH_NONE システム定義ハンドラ(無視)
= MH_BREAK システム定義ハンドラ(処理中断)
= MH_TERM システム定義ハンドラ(プロセス終了)
=0 正常 <0 エラー(エラーコード)
指定したタイプのメッセージに対応するメッセージハンドラを定義する。
同じタイプのメッセージに対するメッセージハンドラがすでに定義されている場合には、 後から定義したメッセージハンドラが有効となる。
ER_ADR : アドレス(msg_hdr)のアクセスは許されていない。 ER_PAR : パラメータが不正である(t_mask≦0)。
|
ERR ret_msg(W ret)
W ret リターン指定
longjmp ()
により制御を他へ移行することになる。
リターンしない(ret = 0 の時) =0 正常(ret≠ 0 の時)
メッセージハンドラの実行を終了する。
メッセージハンドラの最後には必ず本システムコールを実行しなくてはいけない。 また、本システムコールはメッセージハンドラ内でのみ発行することができ、 それ以外の部分で発行された時はシステムエラーとなる。
メッセージハンドラの起動要求が多重に発生していた場合、 本システムコールの実行後に要求のあったメッセージハンドラが起動する。
発生しない。
|
ERR brk_msg()
なし
=0 正常
WAIEVT 指定による rcv_msg() の待ちを解除する。
brk_msg() を呼び出したとき WAIEVT
指定で待ちに入っているタスクが無ければ、
待ち解除の要求を記録する。
ただし、待ち解除の要求回数は記録されない。
発生しない。