Provided by: manpages-ja-dev_0.5.0.0.20131015+dfsg-2_all bug

名前

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

書式

       #include <mqueue.h>

       ssize_t mq_receive(mqd_t mqdes, char *msg_ptr,
                          size_t msg_len, unsigned *msg_prio);

       #include <time.h>
       #include <mqueue.h>

       ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr,
                          size_t msg_len, unsigned *msg_prio,
                          const struct timespec *abs_timeout);

       -lrt でリンクする。

   glibc 向けの機能検査マクロの要件 (feature_test_macros(7)  参照):

       mq_timedreceive():
           _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L

説明

       mq_receive()   は、記述子 mqdes で参照されるメッセージキューから最も高い優先度を持つ 最も古いメッセージを
       削除し、そのメッセージを msg_ptr が指すバッファに格納する。 msg_len 引き数は、 msg_ptr が指すバッファの大
       きさを示す。この値はキューの  mq_msgsize 属性よりも大きくなければならない (mq_getattr(3) 参照)。 msg_prio
       が NULL 以外の場合、 msg_prio が指すバッファに受信したメッセージの優先度が格納される。

       キューが空の場合、デフォルトでは、 mq_receive()  は、新しいメッセージが届くか、関数呼び出しがシグナルハン
       ドラにより  中断されるまで、停止  (block)  する。  メッセージキュー記述  (message  queue  description) で
       O_NONBLOCK フラグが有効になっている場合は、 mq_receive()  はエラー EAGAIN ですぐに失敗する。

       mq_timedreceive()  は mq_receive()  と全く同じ動作をするが、 メッセージキューが空で、メッセージキュー記述
       で O_NONBLOCK フラグが有効になっていない場合に、この呼び出しが停止する時間の上限を abs_timeout が指す構造
       体で指定する点が異なる。この上限は、タイムアウトの時刻を、 時刻紀元  (Epoch;  1970-01-01  00:00:00  +0000
       (UTC)) からの経過時間 (秒とナノ秒の組) で指定する。タイムアウト時刻は以下の構造体で指定する:

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

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

返り値

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

エラー

       EAGAIN キューが空で、かつ mqdes で参照されるメッセージキュー記述で O_NONBLOCK フラグがセットされていた。

       EBADF  mqdes で指定された記述子が不正である。

       EINTR  関数呼び出しがシグナルハンドラにより中断された。 signal(7)  参照。

       EINVAL 関数呼び出しは停止するはずであったが、   abs_timeout   が不正であった。  abs_timeout  が不正とは、
              tv_sec が 0 未満、もしくは tv_nsec が 0 未満か 1,000,000,000 より大きい、ということである。

       EMSGSIZE
              msg_len がメッセージキューの mq_msgsize 属性よりも小さかった。

       ETIMEDOUT
              メッセージが転送される前に関数呼び出しがタイムアウトした。

準拠

       POSIX.1-2001.

注意

       Linux   では、    mq_timedreceive()     はシステムコールである。    mq_receive()     はライブラリ関数で、
       mq_timedreceive()  システムコールを用いて実装されている。

関連項目

       mq_close(3), mq_getattr(3), mq_notify(3), mq_open(3), mq_send(3), mq_unlink(3), mq_overview(7), time(7)

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 3.54 の一部 である。プロジェクトの説明とバグ報告
       に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。