スポンサーリンク

MSGRCV(3) FreeBSD ライブラリ関数マニュアル MSGRCV(3)

名称

msgrcv − メッセージキューからメッセージを受信

ライブラリ

標準 C ライブラリ (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 の値には以下のような意味があります。

 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 の最初のリリースに追加されまし た。

FreeBSD 10.0 November 24, 1997 FreeBSD 10.0

スポンサーリンク