MSGRCV(3)

名称
msgrcv - メッセージキューからメッセージを受信

書式
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg)

解説
msgrcv() 関数は、 msqid で指定したメッセージキューからメッセージを受信し、 msgp が指す構造体に配置します。この構造体は、以下のメンバから 構成されている必要があります。

        long mtype;    /* メッセージタイプ */
        char mtext[1]; /* メッセージ本体 */

mtype は 0 より大きい整数で、メッセージの選択に使用されます。 mtext はバイトの配列で、システム制限 (MSGMAX) までのサイズです。

msgtyp の値には以下のような意味があります。

•   msgtyp が 0 より大きい場合、タイプが msgtyp である最初のメッセージが受信されます。

•   msgtyp が 0 と等しい場合、キューの最初のメッセージが受信されます。

•   msgtyp が 0 より小さい場合、最低メッセージタイプが msgtyp の絶対値以下であるメッセージのうち最初のものが受信されます。

msgsz は、要求したメッセージの最大長を指定します。受信したメッセージが msgsz より長い場合、 msgflg で MSG_NOERROR フラグが設定されていると、メッセージはエラー通知なしで切り捨てられます。 MSG_NOERROR フラグが設定されていないと、エラーが戻されます。

msqid が指定するメッセージキューに、一致するメッセージが存在しない場合、 msgrcv() の動作は、 msgflg で IPC_NOWAIT フラグが設定されているかどうかによって決まります。 IPC_NOWAIT が設定されていると、 msgrcv() はすぐに -1 を戻し、 errno を EAGAIN に設定します。 IPC_NOWAIT が設定されていないと、呼び出しプロセスは、以下の状態になるまでブロック されます。

•   要求されたタイプのメッセージがメッセージキューで 使用できるようになるまで。

•   メッセージキューが削除されるまで。この場合は -1 が戻され、 errno が EINVAL に設定されます。

•   シグナルが受信されるまで。この場合は -1 が戻され、 errno が EINTR に設定されます。

メッセージが問題なく受信されると、 msqid に関連するデータ構造体は、以下のように更新されます。

•   msg_cbytes が、そのメッセージのサイズだけ小さくなります。

•   msg_lrpid が、呼出し側のプロセス ID に設定されます。

•   msg_lrtime が、現在の時刻に設定されます。

•   msg_qnum から 1 が引かれます。

戻り値
問題なく終了すると、 msgrcv() は、 msgp が指す構造体の mtext フィールドに受信したバイト数を戻します。 問題なく終了しない場合 -1 が戻され、 errno がそのエラーを示すように設定されます。

エラー
msgrcv() は、以下のような場合にエラーとなります。

[EINVAL]
    msqid が正しいメッセージキュー ID でない場合。

    要求されたタイプのメッセージが使用できるようになる状態を msgrcv() が待っている間にメッセージキューが削除された場合。

    msgsz が 0 より小さい場合。

[E2BIG]
    一致するメッセージが受信されたが、サイズが msgsz より大きく、 msgflg で MSG_NOERROR フラグが設定されていない場合。

[EACCES]
    呼び出しプロセスに、メッセージキューの読込み権がない場合。

[EFAULT]
    msgp が、正しいアドレスを指していない場合。

[EINTR]
    システムコールが、シグナルの配送によって割り込まれた場合。

[EAGAIN]
    要求されたタイプのメッセージがメッセージキューになく、 msgflg で IPC_NOWAIT が設定されている場合。

関連項目
msgctl(3), msgget(3), msgsnd(3)

バグ
NetBSD と FreeBSD では、メッセージキューが削除された場合に使用すべきエラー値 EIDRM が定義されていません。また、利用可能なメッセージがない状態で IPC_NOWAIT が設定されている場合に使用すべきエラー値 ENOMSG が定義されていません。

歴史
メッセージキューは、 AT&T Unix System V の最初のリリースに 追加されました。