標準
標準/拡張機能 |
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 に対してとられます。
- msg_qnum が 1 だけ減る。
- msg_lrpid が呼び出しプロセスのプロセス ID と
等しく設定される。
- 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 フラグが指定されていたが、メッセージ・キューには、要求される型のメッセージが含まれていません。