EN JA
MSGRCV(2)
MSGRCV(2) FreeBSD System Calls Manual MSGRCV(2)

名称

msgrcvメッセージキューからメッセージを受け取る

ライブラリ

Standard C Library (libc, -lc)

書式

#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 の値には、次の意味の 1 つがあります:

  • msgtyp 引数は、0 より大きいです。タイプ msgtyp の最初のメッセージが受け取られます。
  • msgtyp 引数は、0 と等しいです。キューの最初のメッセージが受け取られます。
  • msgtyp 引数は、0 より小さいです。 msgtyp の絶対値以下である最低のメッセージタイプの最初のメッセージが受け取られます。

msgsz 引数は、要求されたメッセージの最大長を指定します。受け取られたメッセージが msgsz より長くて、 MSG_NOERROR フラグが msgflg に設定されているなら、黙って切り詰められ、そうでなければ、エラーが返されます。

msqid によって指定されるメッセージキューでマッチするメッセージが存在しないなら、 msgrcv() の振る舞いは、 IPC_NOWAIT フラグが msgflg に設定されているかどうかに依存します。 IPC_NOWAIT が設定されているなら、 msgrcv() は、直ちに -1 の値を返し、 errnoENOMSG に設定します。 IPC_NOWAIT が設定されていないなら、呼び出しプロセスは、次の状態になるまでブロックされます:

  • 要求されたタイプのメッセージは、メッセージキューで使用可能となります。
  • メッセージキューは、削除されます、この場合、-1 が返され、 errno は、 EINVAL に設定されます。
  • シグナルが受け取られ、捕獲されます。-1 が返され、 errno は、 EINTR に設定されます。

メッセージが成功して受け取られるなら、 msqid に関連するデータ構造体は、次のように更新されます:

  • msg_cbytes は、メッセージのサイズによって減少させられます。
  • msg_lrpid は、呼び出し側の pid に設定されます。
  • msg_lrtime は、現在の時刻に設定されます。
  • msg_qnum は、1 だけ減少させられます。

戻り値

成功して終了すると、 msgrcv() は、 msgp によって指される構造体の mtext フィールドに受け取ったバイトの数を返します。そうでなければ、-1 が返され、 errno にエラーを示す値が設定されます。

エラー

msgrcv() 関数は、次の場合に失敗します:
[ EINVAL]
msqid 引数が有効なメッセージキュー識別子でありません。

msgrcv() が要求されたタイプのメッセージが使用可能となるのを待っている間に、メッセージキューが、削除されました。

msgsz 引数は、0 未満です。

[ E2BIG]
マッチするメッセージが、受け取られましたが、そのサイズが msgsz より大きく、 MSG_NOERROR フラグが、 msgflg に設定されていませんでした。
[ EACCES]
呼び出しプロセスが、メッセージキューの読み込みアクセス権がありません。
[ EFAULT]
msgp 引数が、無効のアドレスを指しています。
[ EINTR]
システムコールが、シグナルの配信によって割り込まれました。
[ ENOMSG]
メッセージキューで利用可能な要求されたタイプのメッセージがなく、 IPC_NOWAITmsgflg に設定されています。

関連項目

msgctl(2), msgget(2), msgsnd(2)

歴史

メッセージキューは、 AT&T System V UNIX の最初のリリースで登場しました。
July 9, 2009 FreeBSD