__msgrcv_timed() - タイムアウトのあるメッセージ受信操作

標準

標準/拡張機能 C/C++ 依存項目
z/OS®UNIX 両方

OS/390 V2R10

形式

#define _OPEN_SYS_TIMED_EXT 1
#include <time.h>
#include <sys/msg.h>

int __msgrcv_timed(int msgid, void *msgp, size_t msgsz,
                   long int msgtyp, int msgflg, struct timespec *set);

機能説明

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 は、要求される型のメッセージが キューにない場合に行われるアクションを指定します。以下のとおりです。

引数の set は、タイムアウト値の入った timespec 構造体です。
  • IPC_NOWAIT フラグが msgflg 内でオンの 場合、呼び出しプロセスは -1 の戻り値で即時に戻り、errno は ENOMSG に設定されます。
  • IPC_NOWAIT フラグが msgflg で オフの場合、呼び出しプロセスは、以下のいずれかが起こるまで 実行を中断する。
    • 要求される型のメッセージがキューに配置される。
    • メッセージ・キュー ID の msgid が システムから取り除かれる。つまり、これが起こると、errno が EIDRM に 設定され、-1 の値が戻される。
    • 呼び出しプロセスが、キャッチされる予定のシグナルを 受信する。この場合、メッセージは受信されず、呼び出しプロセスは実行を再開する。-1 の値が戻され、errno が EINTR に設定される。
正常に終了した場合は、以下のアクションが、msgid に関連するデータ構造体の msqid_ds に対してとられます。
  1. msg_qnum が 1 だけ減る。
  2. msg_lrpid が呼び出しプロセスのプロセス ID と 等しく設定される。
  3. msg_rtime が現行時間と等しく設定される。
変数の set は、タイムアウト指定を行います。
  • __msgrcv_timed() 関数は、msgid で指定されたメッセージが受信されないことが分かると、set で参照されている timespec 構造体内に指定されている時間の間、待機します。set が指す timespec 構造体の値がゼロである場合、および msgid で指定されたメッセージが受信されない場合、__msgrcv_timed() は、即時に EAGAIN を戻します。<limits.h> に定義されているように、INT_MAX を設定された tv_sec フィールドを持つ timespec は、__msgrcv_timed() サービスをシグナルが受信されるまで待機させます。set が NULL ポインターである場合、このプラットフォームでは、timespec 構造体に INT_MAX を設定された tv_sec フィールドが含まれている場合と同じように扱われます。

戻り値

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

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

関連情報