MSGOP(2)

名前
msgop - メッセージ(message)操作

書式
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>

int msgsnd ( int msqid, struct msgbuf *msgp, int msgsz, int msgflg )

int msgrcv ( int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg )

説明
メッセージ(message)を送ったり受けたりするために 呼び出したプロセスは以下のような構造体を割り当てる。

    struct msgbuf {
    long    mtype;
/* message type, must be > 0 */
    char    mtext[1];
/* message data */
    };

しかし、配列 mtext の大きさ msgsz は非負の整数でなればならない。 構造体のメンバー mtype はメッセージを受けとるプロセスによってメッセージを選択できるように 厳密に正の整数でなければならない。( msgrcv の段落を見よ。)

呼び出したプロセスはメッセージを送るためにはキュー(queue)への 書き込み許可を、メッセージを受けるためにはキューへの読み込み許可を 持たなればならない。

msgsnd システム・コールは msgp 引き数で指定されたメッセージのコピーを msqid 引き数の値で指定されたメッセージ・キューへ入れる。

msgflg 引き数は、新しいメッセージをキューに入れるのにキューに msg_qbytes より多くが必要な場合の動作を指定する。 IPC_NOWAIT が指定された場合、メッセージは送られず、システム・コールは失敗して errno に EAGAIN を設定して返される。そうでなれば、そのような状況がなくなるか、 キューが削除されるか、プロセスが捕獲(catch)すべきシグナル(signal)を 受けるまで、プロセス(process)の実行を停止(suspend)する。 (停止するような状況がなくなればメッセージが送られてシステム・コールは 成功する、キューが削除された場合はシステム・コールは失敗し errno に EIDRM が設定される、シグナルを受けとった場合はシステム・コールは失敗し errno に EINTR が設定される。)

完全に成功した場合にはメッセージ・キュー・データ構造体は以下のように 更新される:

    msg_lspid には呼び出したプロセスのプロセス ID が設定される。

    msg_qnum は 1 増加する。

    msg_stime には現在時刻が設定される。

msgrcv システム・コールは msqid で指定したメッセージ・キューから msgp 引き数によって指定された msgbuf 構造体へとメッセージを読みとり、成功した場合には、キューから読んだ メッセージを削除する。

msgsz 引き数には msgp 引き数で指定された構造体の mtext メンバーの最大のバイト数を指定する。 もしメッセージのテキストの長さが msgsz より大きい場合には、 msgflg に MSG_NOERROR が指定されていればメッセージのテキストは切り詰められる、 そうでなければメッセージはキューから削除されず、 システム・コールは失敗し errno に E2BIG が設定される。

msgtyp 引き数は要求したメッセージの型(type)を以下のように与える:

    msgtyp が 0 ならば、キューの最初にあるメッセージが読み込まれる。

    msgtyp が 0 より大きければ、 msgflg に MSG_EXCEPT が指定されていなければキューの最初の msgtyp 型のメッセージが読み込まれる。 MSG_EXCEPT が指定されていた場合はキューの最初の msgtyp 型以外のメッセージが読み込まれる。

    msgtyp が 0 より小さければ、 msgtyp の絶対値以下の最も小さい型を持つキューの最初のメッセージが読み込まれる。

msgflg 引き数には以下のフラグを 0, 1, 複数を(それらの ORで)与える:

    IPC_NOWAIT キューに要求された型のメッセージがない場合にはただちに返る。 システム・コールは失敗し errno には ENOMSG が設定される。

    MSG_EXCEPT 0 より大きな msgtyp と一緒に使用して、 キューの最初の msgtyp 以外のメッセージを読む。

    MSG_NOERROR msgsz バイトよりも長かった場合はメッセージのテキストを切り詰める。

要求された型のメッセージが存在せず、 msgflg に IPC_NOWAIT が指定されていなかった場合、以下の状況が起きるまで呼び出したプロセスは 停止(block)する:

    求めている型のメッセージがキューへ入れられた。

    メッセージ・キューがシステムから削除された。 この場合はシステム・コールは失敗し errno に EIDRM が設定される。

    呼び出したプロセスが捕獲すべきシグナルを受けた。 この場合はシステム・コールは失敗し、 errno に EINTR が設定される。

完全に成功した場合にはメッセージ・キュー・データ構造体は以下のように 更新される:

    msg_lrpid には呼び出したプロセスのプロセス ID が設定される。

    msg_qnum は 1 減少させられる。

    msg_rtime には現在時刻が設定される。

返り値
失敗した場合にはどちらの関数も -1 を返し、エラーを errno に指示する。そうでなれば msgsnd は 0 を返し、 msgrvc は 実際に mtext 配列に コピーしたバイト数を返す。

エラー
msgsnd が失敗した場合には errno に以下の値のどれかを設定して返される:

EAGAIN
    msg_qbytes がキューの限界を超えており mgsflg に IPC_NOWAIT が指定されていたためメッセージを送ることができなかった。

EACCES
    呼び出したプロセスがメッセージ・キューに対する書き込み許可を 持っていない。

EFAULT
    msgp が指しているアドレスがアクセス可能でない。

EIDRM
    メッセージ・キューが削除された。

EINTR
    メッセージ・キューの状態を満たすために停止(sleep)している時に、 プロセスが捕獲(catch)すべきシグナルを受けとった。

EINVAL
    msqid が不適切な値であるか、 mtype が正の値でないか、 msgsz が不適切な値(0 以下か、システム値の MSGMAX よりも大きい。)

ENOMEM
    msgbuf にコピーを作成するための十分なメモリがシステムに存在しない。

msgrcv が失敗した場合には errno に以下の値のどれかを設定して返される:

E2BIG
    メッセージのテキストの長さが msgsz よりも大きく、 msgflg に MSG_NOERROR が設定されていなかった。

EACCES
    呼び出したプロセスがメッセージ・キューに対する 読み込み許可を持っていなかった。

EFAULT
    msgp が指しているアドレスがアクセス可能でなかった。

EIDRM
    メッセージを受けるためにプロセスが停止(sleep)している間に、 メッセージ・キューが削除された。

EINTR
    メッセージを受けるためにプロセスが停止(sleep)している間に、 プロセスが捕獲すべきシグナルを受けた。

EINVAL
    msgqid が不正か、 msgsz が 0 より小さい。

ENOMSG
    msgflg に IPC_NOWAIT が設定されており、 メッセージ・キューに要求された型のメッセージが存在しなかった。

注意
以下は msgsnd システム・コールに影響するシステム制限である:

MSGMAX
    メッセージのテキストの最大サイズ: 実装で 4080 バイトに設定されている。

MSGMNB
    メッセージ・キューのバイト・サイズのデフォルトの最大サイズ: 方針依存。 スーパー・ユーザーは msgctl システム・コールでメッセージ・キューのサイズを MSGMNB よりも大きい値に増加させることができる。

現在の実装では、システム全体のメッセージ・ヘッダーの数 (MSGTQL) と、システム全体のメッセージ・プールの最大バイト数 (MSGPOOL) に固有の上限はない。

準拠
SVr4, SVID.

関連項目
ipc(5), msgctl(2), msgget(2), msgrcv(2), msgsnd(2).