msgrcv() - メッセージ受信操作

標準

標準/拡張機能 C/C++ 依存項目

XPG4
XPG4.2
Single UNIX Specification、バージョン 2
Single UNIX Specification、バージョン 3

両方  

形式

Single UNIX Specification、バージョン 2
#define _XOPEN_SOURCE
#include <sys/msg.h>

int msgrcv(int msgid, void *msgp, size_t msgsz, long int msgtyp, int msgflg);
Single UNIX Specification、バージョン 2
#define _XOPEN_SOURCE 500
#include <sys/msg.h>

ssize_t msgrcv(int msgid, void *msgp, size_t msgsz, long int msgtyp, int msgflg);

機能説明

msgrcv() 関数は、msgid で指定されている メッセージ・キュー ID に関連したキューから メッセージを読み取り、msgp が指す ユーザー定義バッファーにそのメッセージを入れます。

引数の msgp は、メッセージの型を指定する long int 型のフィールドを最初に含み、次にメッセージのデータ・バイトを保持するデータ部分を含む必要のある、ユーザー定義バッファーを指定します。次の構造体は、このユーザー定義バッファーの指定の例です。
struct message
{
     long int   mtype;    Message type
     int        mtext[n]; Message text
}

構造体メンバーの mtype は、送信プロセスで 指定された受信メッセージの型です。構造体メンバーの mtext は メッセージのテキストです。

引数 msgsz は、mtext のバイト・サイズを指定します。受信メッセージが msgsz よりも大きく、MSG_NOERROR フラグが引数の msgflg で指定されている場合、この受信メッセージは、msgsz バイトに切り捨てられます。メッセージの切り捨て部分は失われ、切り捨てられたことを示すものは呼び出し側プロセスには渡されません。

引数の msgtyp は、要求されるメッセージの型を以下のように指定します。
  • msgtyp が 0 の場合、キューの先頭メッセージが受信される。
  • msgtyp が 0 より大きい場合、msgtyp 型の先頭メッセージが受信される。
  • msgtyp が 0 より小さい場合、msgtyp の絶対値と同じか それ以下の最小型の先頭メッセージが受信される。
引数の msgflg は、要求される型のメッセージが キューにない場合に行われるアクションを指定します。以下のとおりです。
  • IPC_NOWAIT フラグが msgflg 内でオンの 場合、呼び出しプロセスは -1 の戻り値で即時に戻り、errno は ENOMSG に設定されます。
  • IPC_NOWAIT フラグが msgflg で オフの場合、呼び出しプロセスは、以下のいずれかが起こるまで 実行を中断する。
    • 要求される型のメッセージがキューに配置される。
    • メッセージ・キュー ID の msgid が システムから取り除かれる。つまり、これが起こると、errno が EIDRM に 設定され、-1 の値が戻される。
    • 呼び出しプロセスが、キャッチされる予定のシグナルを 受信する。この場合、メッセージは受信されず、呼び出しプロセスは実行を再開する。-1 の値が戻され、errno が EINTR に設定される。
正常に終了した場合は、以下のアクションが、msgid に関連するデータ構造体の msgiq_ds に対してとられます。
  1. msg_qnum が 1 だけ減る。
  2. msg_lrpid が呼び出しプロセスのプロセス ID と 等しく設定される。
  3. msg_rtime が現行時間と等しく設定される。

戻り値

正常に実行された場合、msgrcv() は、実際に入っているバイト数と等しい値を、msgp が示す ユーザー定義バッファーの mtext フィールドに戻します。ゼロの値は、mtype フィールドだけが メッセージ・キューから受信されたことを示します。

正常に実行されなかった場合、msgrcv() は -1 を戻して、errno を次のいずれかの値に設定します。
エラー・コード
説明
E2BIG
mtext の値が msgsz より大きく、フラグの MSG_NOERROR が指定されていません。
EACCES
呼び出しプロセスに、メッセージ・キュー ID msgid に関連したメッセー ジ・キューの読み取り許可がありません。あるいは、メッセージ・キューが IPC_RCVTYPEPID で作成され 、さらに Message_Type が呼び出し元のプロセス ID (JRTypeNotPID) ではありませんでした。
EIDRM
msgrcv() の呼び出し元が待機している間に、メッセージ・キュー ID の msgid がシステムから 取り除かれました。
EINTR
msgrcv() 関数がメッセージを受信する前に、シグナルで 割り込まれました。
EINVAL
msgid 引数の値が有効な メッセージ・キュー ID ではないか、msgsz の値がゼロより小さい値です。
ENOMSG
IPC_NOWAIT フラグが指定されていたが、メッセージ・キューには、要求される型のメッセージが含まれていません。

関連情報