この章の目次にもどる
前頁:1.1 プロセス / タスク管理にもどる
次頁:1.3 プロセス/タスク間同期通信管理にすすむ

1.2 メッセージ管理

1.2.1 プロセス間メッセージ

プロセスにはメッセージキューが付属しており、 このメッセージキューを経由してプロセス間メッセージ通信が行なわれる。 この機能は、プロセス間でのアプリケーションメッセージの通信だけではなく、 子プロセスの終了メッセージ等のシステムでの用途にも使用される。 このため、いくつかのメッセージの形式はシステムで定義されている。

メッセージは、プロセスに付属しているメッセージキューに送られ、 送信先はそのプロセス 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.2.2 メッセージの種類

メッセージは 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 ()で指定したコード */

1.2.3 メッセージハンドラ

メッセージハンドラとは、 受信したメッセージを現在実行中の処理と非同期に処理するための関数であり、 メッセージのタイプと、対応する関数を指定することにより定義される。 従って、メッセージの各タイプに対応した最大 31 種のメッセージハンドラを同時に定義可能である。

メッセージハンドラは以下に示す形で起動されて実行される。

メッセージハンドラは、以下に示す形の関数として定義される。

    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 ) を親プロセスに送信する。

1.2.4 データ/定数の定義

□ プロセスメッセージ定義

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)      /* プロセス終了 */

1.2.5 システムコール

snd_msg
 
メッセージ送信

【形式】

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以下である。
rcv_msg
 
メッセージ受信

【形式】

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 指定の時は、 次のような動作になる。

  1. メッセージが何も存在しない場合、WAIT または WAIEVT 指定時は待ち、 NOWAIT 指定時はエラー終了する。

  2. 指定したタイプのメッセージが存在している場合は、 msg にメッセージを格納し正常終了する。 CLR 指定であればキューから取り除き、 NOCLR 指定であればキューに残す。

  3. 指定したタイプのメッセージが存在せず、 それ以外のメッセージが存在している場合は、 メッセージの先頭 8 バイト ( msg_typemsg_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)。
clr_msg
 
メッセージクリア

【形式】

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_masklast_mask の指定例を以下に示す。

t_masklast_mask動作
MM_ALLMM_NULL 受信済みの全メッセージをクリア
MM_ALL t_mask で指定したメッセージを 1 つだけクリア
MM_ALLMM_ALL 先頭のメッセージを1つだけクリア

【エラーコード】

ER_PAR  : パラメータが不正である(t_mask≦0、last_mask<0)。
req_tmg
 
タイムアウトメッセージ要求

【形式】

ERR req_tmg(W time, W code)

【パラメータ】

W   time    メッセージ送信時間(ミリ秒)
W   code    タイムアウトメッセージのコード

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

自プロセス宛に指定した時間後にタイムアウトメッセージ ( MS_TMOUT ) を送信することを要求する。

この機能は、 メッセージハンドラと組み合わせて特定の処理のタイムアウト監視などに使用される。

【エラーコード】

ER_NOSPC    : システムのメモリ領域が不足した。
ER_PAR      : パラメータが不正である(time≦0)。
can_tmg
 
タイムアウトメッセージ取り消し

【形式】

     ERR can_tmg()

【パラメータ】

なし

【リターン値】

=0    正常

【解説】

自プロセスのタイムアウトメッセージ要求をすべて取り消す。 タイムアウトメッセージ要求がない場合は何もしない。

すでに送信されてメッセージキューに入っているタイムアウトメッセージはクリアされない。

【エラーコード】

発生しない。

def_msg
 
メッセージハンドラ定義

【形式】

  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)。
ret_msg
 
メッセージハンドラ終了

【形式】

ERR ret_msg(W ret)

【パラメータ】

W   ret リターン指定
=0 :
メッセージハンドラが割り込んだ位置から実行を再開し、 本システムコールからは戻らない。
待ちを含むシステムコールの実行中に割り込んだ場合、 そのシステムコールの実行は保証されずに、 メッセージハンドラが起動されたことを示すエラーコードがそのシステムコールから戻る。
≠0 :
メッセージハンドラが割り込んだ位置からは再開せずに、 本システムコールから戻って、 そのまま実行を続行する。 この場合、通常はハンドラの最後で longjmp () により制御を他へ移行することになる。

【リターン値】

リターンしない(ret = 0 の時)
=0     正常(ret≠ 0 の時)

【解説】

メッセージハンドラの実行を終了する。

メッセージハンドラの最後には必ず本システムコールを実行しなくてはいけない。 また、本システムコールはメッセージハンドラ内でのみ発行することができ、 それ以外の部分で発行された時はシステムエラーとなる。

メッセージハンドラの起動要求が多重に発生していた場合、 本システムコールの実行後に要求のあったメッセージハンドラが起動する。

【エラーコード】

発生しない。

brk_msg
 
イベント発生通知

【形式】

ERR brk_msg()

【パラメータ】

なし

【リターン値】

=0    正常

【解説】

WAIEVT 指定による rcv_msg() の待ちを解除する。 brk_msg() を呼び出したとき WAIEVT 指定で待ちに入っているタスクが無ければ、 待ち解除の要求を記録する。 ただし、待ち解除の要求回数は記録されない。

【エラーコード】

発生しない。


この章の目次にもどる
前頁:1.1 プロセス / タスク管理にもどる
次頁:1.3 プロセス/タスク間同期通信管理にすすむ