other versions
other sections
MQ_NOTIFY(3) | Linux Programmer's Manual | MQ_NOTIFY(3) |
名前¶
mq_notify - メッセージ到着時に通知を行うよう登録する書式¶
#include <mqueue.h>int mq_notify(mqd_t mqdes, const struct sigevent *notification);
説明¶
mq_notify() を使うと、ディスクリプタ mqdes で参照される空のメッセージキューに新しくメッセージが到着した時に 非同期の通知 (notification) の配送が行われるように登録したり、 その解除を行ったりできる。- SIGEV_NONE
- 「空の (null)」の通知: 呼び出し元のプロセスを通知の宛先として登録するが、 実際にはメッセージが到着した時に通知は送られない。
- SIGEV_SIGNAL
- sigev_signo で指定されたシグナルを送って、プロセスに通知する。 一般的な詳細については sigevent(7) を参照。 siginfo_t 構造体の si_code フィールドには SI_MESGQ が設定される。 さらに、 si_pid にはメッセージを送信したプロセスの PID が、 si_uid には送信プロセスの実ユーザ ID が設定される。
- SIGEV_THREAD
- メッセージの配送時には、 sigev_notify_function があたかも新しいスレッドの開始関数であるかのように起動される。 詳細は sigevent(7) を参照。
返り値¶
成功すると、 mq_notify() は 0 を返す。エラーの場合、-1 を返し、 errno をエラーを示す値に設定する。エラー¶
- EBADF
- mqdes に指定されたディスクリプタが不正である。
- EBUSY
- 別のプロセスがすでに このメッセージキューに対する通知を受信するように登録している。
- EINVAL
- sevp->sigev_notify が許可された値のいずれでもない。もしくは sevp->sigev_notify が SIGEV_SIGNAL だが sevp->sigev_signo が有効なシグナル番号ではない。
- ENOMEM
- 十分なメモリがない。
準拠¶
POSIX.1-2001.例¶
以下のプログラムは、 コマンドライン引き数で指定された名前のメッセージキューへの 通知要求を登録し、通知はスレッドの作成によって行われる。 そのスレッドは、そのキューからメッセージを一つ読み出してから、 プロセスを終了する関数を実行する。#include <pthread.h> #include <mqueue.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) static void /* スレッド開始関数 */ tfunc(union sigval sv) { struct mq_attr attr; ssize_t nr; void *buf; mqd_t mqdes = *((mqd_t *) sv.sival_ptr); /* 最大メッセージサイズを決定し、 メッセージ受信用のバッファを確保する */ if (mq_getattr(mqdes, &attr) == -1) handle_error("mq_getattr"); buf = malloc(attr.mq_msgsize); if (buf == NULL) handle_error("malloc"); nr = mq_receive(mqdes, buf, attr.mq_msgsize, NULL); if (nr == -1) handle_error("mq_receive"); printf("Read %ld bytes from MQ\n", (long) nr); free(buf); exit(EXIT_SUCCESS); /* プロセスを終了する */ } int main(int argc, char *argv[]) { mqd_t mqdes; struct sigevent sev; if (argc != 2) { fprintf(stderr, "Usage: %s <mq-name>\n", argv[0]); exit(EXIT_FAILURE); } mqdes = mq_open(argv[1], O_RDONLY); if (mqdes == (mqd_t) -1) handle_error("mq_open"); sev.sigev_notify = SIGEV_THREAD; sev.sigev_notify_function = tfunc; sev.sigev_notify_attributes = NULL; sev.sigev_value.sival_ptr = &mqdes; /* スレッド関数に渡す引き数 */ if (mq_notify(mqdes, &sev) == -1) handle_error("mq_notify"); pause(); /* プロセスはスレッド関数により終了される */ }
関連項目¶
mq_close(3), mq_getattr(3), mq_open(3), mq_receive(3), mq_send(3), mq_unlink(3), mq_overview(7), sigevent(7)この文書について¶
この man ページは Linux man-pages プロジェクトのリリース 3.41 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2010-10-04 | Linux |