MSGRCV(3) FreeBSD ライブラリ関数マニュアル MSGRCV(3)
名称
msgrcv − メッセージキューからメッセージを受信 |
ライブラリ
標準 C ライブラリ (libc, −lc) |
書式
#include <sys/types.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] [EACCES] [EFAULT] [EINTR] [EAGAIN] 関連項目 |
バグ
NetBSD と FreeBSD では、メッセージキューが削除された場合に使用すべきエ ラー値 EIDRM が定義されていません。また、利用可能なメッセージがない状態で IPC_NOWAIT が設定されている場合に使用すべきエラー値 ENOMSG が定義されてい ません。 |
歴史
メッセージキューは、 AT&T Unix System V の最初のリリースに追加されまし た。 FreeBSD 10.0 November 24, 1997 FreeBSD 10.0 |