kazmax - Linux で自宅サーバー

mq_receive - ライブラリコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 返り値
  5. エラー
  6. 準拠
  7. 関連項目

名前

mq_receive, mq_timedreceive - メッセージキューからメッセージを受信する

書式

#include <mqueue.h>

mqd_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio);
#define _XOPEN_SOURCE 600#include <time.h>#include <mqueue.h>
mqd_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout);

説明

mq_receive ()は、記述子 mqdes で参照されるメッセージキューから最も高い優先度を持つ 最も古いメッセージを削除し、そのメッセージを msg_ptr が指すバッファに格納する。 msg_len 引き数は、 msg_ptr が指すバッファの大きさを示す。この値はキューの mq_msgsize 属性よりも大きくなければならない ( mq_getattr (3)参照)。 prio が NULL 以外の場合、 prio が指すバッファに受信したメッセージの優先度が格納される。
キューが空の場合、デフォルトでは、 mq_receive ()は、新しいメッセージが届くか、関数呼び出しがシグナルハンドラにより 中断されるまで、停止 (block) する。 メッセージキュー記述 (message queue description) で O_NONBLOCK フラグが有効になっている場合は、 mq_receive ()はエラー EAGAIN ですぐに失敗する。
mq_timedreceive ()は mq_receive ()と全く同じ動作をするが、 メッセージキューが空で、メッセージキュー記述で O_NONBLOCK フラグが有効になっていない場合に、この呼び出しが停止する時間の上限を abs_timeout が指す構造体で指定する点が異なる。この上限は、タイムアウトの時刻を 時刻紀元 (Epoch; 1970 年 1 月 1 日 00:00:00) からの経過時間 (秒とナノ秒の組) で指定する。タイムアウト時刻は以下の構造体で指定する:

struct timespec {
    time_t tv_sec;        /* 秒 */
    long   tv_nsec;       /* ナノ秒 */
};



メッセージがキューになく、関数呼び出し時にすでにタイムアウト時刻が 過ぎている場合、 mq_timedreceive ()はすぐに返る。

返り値

成功すると、 mq_receive ()と mq_timedreceive ()は受信したメッセージのバイト数を返す。 エラーの場合、-1 を返し、 errno にエラーを示す値を設定する。

エラー

EAGAIN
キューが空で、かつ mqdes で参照されるメッセージキュー記述で O_NONBLOCK フラグがセットされていた。
EBADF
mqdes で指定された記述子が不正である。
EMSGSIZE
msg_len がメッセージキューの mq_msgsize 属性よりも小さかった。
EINTR
関数呼び出しがシグナルハンドラにより中断された。
EINVAL
関数呼び出しは停止するはずであったが、 abs_timeout が不正であった。 abs_timeout が不正とは、 tv_sec が 0 未満、もしくは tv_nsec が 0 未満か 1,000,000,000 より大きい、ということである。
ETIMEDOUT
メッセージが転送される前に関数呼び出しがタイムアウトした。

準拠

POSIX.1-2001.

関連項目