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 の値を返し、 errno を ENOMSG に設定します。 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_NOWAIT が msgflg に設定されています。
歴史
メッセージキューは、 AT&T System V UNIX の最初のリリースで登場しました。July 9, 2009 | FreeBSD |