.\" Updated 2010-10-27, Akihiro Motoki, LDP v3.29
.\"
.TH MQ_NOTIFY 3 2010-10-04 "Linux" "Linux Programmer's Manual"
-.SH ̾Á°
-mq_notify \- ¥á¥Ã¥»¡¼¥¸ÅþÃå»þ¤ËÄÌÃΤò¹Ô¤¦¤è¤¦ÅÐÏ¿¤¹¤ë
-.SH ½ñ¼°
+.SH 名前
+mq_notify \- メッセージ到着時に通知を行うよう登録する
+.SH 書式
.nf
.B #include <mqueue.h>
.sp
.BI "int mq_notify(mqd_t " mqdes ", const struct sigevent *" notification );
.fi
.sp
-\fI\-lrt\fP ¤Ç¥ê¥ó¥¯¤¹¤ë¡£
-.SH ÀâÌÀ
+\fI\-lrt\fP でリンクする。
+.SH 説明
.BR mq_notify ()
-¤ò»È¤¦¤È¡¢¥Ç¥£¥¹¥¯¥ê¥×¥¿
+ã\82\92使ã\81\86ã\81¨ã\80\81ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿
.I mqdes
-¤Ç»²¾È¤µ¤ì¤ë¶õ¤Î¥á¥Ã¥»¡¼¥¸¥¥å¡¼¤Ë¿·¤·¤¯¥á¥Ã¥»¡¼¥¸¤¬ÅþÃ夷¤¿»þ¤Ë
-ÈóƱ´ü¤ÎÄÌÃÎ (notification) ¤ÎÇÛÁ÷¤¬¹Ô¤ï¤ì¤ë¤è¤¦¤ËÅÐÏ¿¤·¤¿¤ê¡¢
-¤½¤Î²ò½ü¤ò¹Ô¤Ã¤¿¤ê¤Ç¤¤ë¡£
+で参照される空のメッセージキューに新しくメッセージが到着した時に
+非同期の通知 (notification) の配送が行われるように登録したり、
+その解除を行ったりできる。
.I sevp
-°ú¤¿ô¤Ï
+引き数は
.I sigevent
-¹½Â¤ÂΤؤΥݥ¤¥ó¥¿¤Ç¤¢¤ë¡£
-¤³¤Î¹½Â¤ÂΤÎÄêµÁ¤È°ìÈÌŪ¤Ê¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï
+構造体へのポインタである。
+この構造体の定義と一般的な詳細については
.BR sigevent (7)
-¤ò»²¾È¡£
+を参照。
.PP
.I sevp
-¤¬ NULL ¤Ç¤Ê¤¤¥Ý¥¤¥ó¥¿¤Ç¤¢¤ì¤Ð¡¢
+が NULL でないポインタであれば、
.BR mq_notify ()
-¤Ï¥á¥Ã¥»¡¼¥¸ÄÌÃΤò¼õ¤±¼è¤ë¤è¤¦¤Ë¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤òÅÐÏ¿¤¹¤ë¡£
+はメッセージ通知を受け取るように呼び出し元のプロセスを登録する。
.I sevp
-¤¬»Ø¤¹
+が指す
.I sigevent
-¹½Â¤ÂΤÎ
+構造体の
.I sigev_notify
-¥Õ¥£¡¼¥ë¥É¤Ï¡¢¤É¤Î¤è¤¦¤ÊÄÌÃΤò¹Ô¤¦¤Î¤«¤ò»ØÄꤹ¤ë¡£
-¤³¤Î¥Õ¥£¡¼¥ë¥É¤Ï°Ê²¼¤ÎÃͤΤ¤¤º¤ì¤«¤ò»ý¤Ä¡£
+フィールドは、どのような通知を行うのかを指定する。
+このフィールドは以下の値のいずれかを持つ。
.TP
.B SIGEV_NONE
-¡Ö¶õ¤Î (null)¡×¤ÎÄÌÃÎ: ¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤òÄÌÃΤΰ¸Àè¤È¤·¤ÆÅÐÏ¿¤¹¤ë¤¬¡¢
-¼ÂºÝ¤Ë¤Ï¥á¥Ã¥»¡¼¥¸¤¬ÅþÃ夷¤¿»þ¤ËÄÌÃΤÏÁ÷¤é¤ì¤Ê¤¤¡£
+「空の (null)」の通知: 呼び出し元のプロセスを通知の宛先として登録するが、
+実際にはメッセージが到着した時に通知は送られない。
.\" When is SIGEV_NONE useful?
.TP
.B SIGEV_SIGNAL
.I sigev_signo
-¤Ç»ØÄꤵ¤ì¤¿¥·¥°¥Ê¥ë¤òÁ÷¤Ã¤Æ¡¢¥×¥í¥»¥¹¤ËÄÌÃΤ¹¤ë¡£
-°ìÈÌŪ¤Ê¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï
+で指定されたシグナルを送って、プロセスに通知する。
+一般的な詳細については
.BR sigevent (7)
-¤ò»²¾È¡£
+を参照。
.I siginfo_t
-¹½Â¤ÂΤÎ
+構造体の
.I si_code
-¥Õ¥£¡¼¥ë¥É¤Ë¤Ï
+フィールドには
.B SI_MESGQ
-¤¬ÀßÄꤵ¤ì¤ë¡£
+が設定される。
.\" I don't know of other implementations that set
.\" si_pid and si_uid -- MTK
-¤µ¤é¤Ë¡¢
+さらに、
.I si_pid
-¤Ë¤Ï¥á¥Ã¥»¡¼¥¸¤òÁ÷¿®¤·¤¿¥×¥í¥»¥¹¤Î PID ¤¬¡¢
+にはメッセージを送信したプロセスの PID が、
.I si_uid
-¤Ë¤ÏÁ÷¿®¥×¥í¥»¥¹¤Î¼Â¥æ¡¼¥¶ ID ¤¬ÀßÄꤵ¤ì¤ë¡£
+には送信プロセスの実ユーザ ID が設定される。
.TP
.B SIGEV_THREAD
-¥á¥Ã¥»¡¼¥¸¤ÎÇÛÁ÷»þ¤Ë¤Ï¡¢
+メッセージの配送時には、
.I sigev_notify_function
-¤¬¤¢¤¿¤«¤â¿·¤·¤¤¥¹¥ì¥Ã¥É¤Î³«»Ï´Ø¿ô¤Ç¤¢¤ë¤«¤Î¤è¤¦¤Ëµ¯Æ°¤µ¤ì¤ë¡£
-¾ÜºÙ¤Ï
+があたかも新しいスレッドの開始関数であるかのように起動される。
+詳細は
.BR sigevent (7)
-¤ò»²¾È¡£
+を参照。
.PP
-°ì¤Ä¤Î¥á¥Ã¥»¡¼¥¸¥¥å¡¼¤«¤éÄÌÃΤò¼õ¿®¤¹¤ë¤è¤¦¤ËÅÐÏ¿¤Ç¤¤ë¥×¥í¥»¥¹¤Ï
-°ì¤Ä¤À¤±¤Ç¤¢¤ë¡£
+一つのメッセージキューから通知を受信するように登録できるプロセスは
+一つだけである。
.I sevp
-¤¬ NULL ¤Ç¡¢¤«¤Ä¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤¬¤³¤Î¥á¥Ã¥»¡¼¥¸¥¥å¡¼¤«¤é¤Î
-ÄÌÃΤò¼õ¿®¤¹¤ë¤Ë¸½ºßÅÐÏ¿¤·¤Æ¤¤¤ë¾ì¹ç¡¢ÅÐÏ¿¤òºï½ü¤¹¤ë¡£
-¤³¤ì°Ê¹ß¡¢ÊÌ¤Î¥×¥í¥»¥¹¤¬¤³¤Î¥á¥Ã¥»¡¼¥¸¥¥å¡¼¤«¤éÄÌÃΤò¼õ¿®¤¹¤ë¤è¤¦¤Ë
-ÅÐÏ¿¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤ë¡£
+が NULL で、かつ呼び出し元のプロセスがこのメッセージキューからの
+通知を受信するに現在登録している場合、登録を削除する。
+これ以降、別のプロセスがこのメッセージキューから通知を受信するように
+登録できるようになる。
-¥á¥Ã¥»¡¼¥¸ÄÌÃΤϡ¢¤½¤ì¤Þ¤Ç¶õ¤Î¥¥å¡¼¤Ë¿·¤·¤¤¥á¥Ã¥»¡¼¥¸¤¬ÅþÃ夷¤¿
-¾ì¹ç¤Ë¤Î¤ß¹Ô¤ï¤ì¤ë¡£
+メッセージ通知は、それまで空のキューに新しいメッセージが到着した
+場合にのみ行われる。
.BR mq_notify ()
-¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿»þ¤Ë¤½¤Î¥¥å¡¼¤¬¶õ¤Ç¤Ê¤¤¾ì¹ç¡¢
-¤½¤Î¥¥å¡¼¤¬¶õ¤Ë¤Ê¤ê¡¢¤½¤Î¸å¿·¤·¤¤¥á¥Ã¥»¡¼¥¸¤¬ÅþÃ夷¤¿»þ¤Ë
-½é¤á¤ÆÄÌÃΤ¬¹Ô¤ï¤ì¤ë¤³¤È¤Ë¤Ê¤ë¡£
+が呼び出された時にそのキューが空でない場合、
+そのキューが空になり、その後新しいメッセージが到着した時に
+初めて通知が行われることになる。
-ÊÌ¤Î¥×¥í¥»¥¹¤ä¥¹¥ì¥Ã¥É¤¬
+別のプロセスやスレッドが
.BR mq_receive (3)
-¤ò»È¤Ã¤Æ¡¢¶õ¤Î¥¥å¡¼¤«¤é¥á¥Ã¥»¡¼¥¸¤ÎÆɤ߽Ф·¤òÂԤäƤ¤¤ë¾ì¹ç¡¢
-¥á¥Ã¥»¡¼¥¸ÄÌÃΤÎÅÐÏ¿¤ÏÁ´¤Æ̵»ë¤µ¤ì¤ë¡£
-¥á¥Ã¥»¡¼¥¸¤Ï
+を使って、空のキューからメッセージの読み出しを待っている場合、
+メッセージ通知の登録は全て無視される。
+メッセージは
.BR mq_receive (3)
-¤ò¸Æ¤Ó½Ð¤·¤Æ¤¤¤ë¥×¥í¥»¥¹¤ä¥¹¥ì¥Ã¥É¤ËÇÛÁ÷¤µ¤ì¡¢
-¥á¥Ã¥»¡¼¥¸ÄÌÃΤÎÅÐÏ¿¤Ï¸úÎϤò»ý¤Ã¤¿¤Þ¤Þ¤È¤Ê¤ë¡£
+を呼び出しているプロセスやスレッドに配送され、
+メッセージ通知の登録は効力を持ったままとなる。
-ÄÌÃΤϰìÅÙ¤À¤±¹Ô¤ï¤ì¤ë¡£ÄÌÃΤ¬Á÷¤é¤ì¤¿¸å¤Ï¡¢ÄÌÃÎÍ×µá¤ÎÅÐÏ¿¤Ïºï½ü¤µ¤ì¡¢
-ÊÌ¤Î¥×¥í¥»¥¹¤¬¥á¥Ã¥»¡¼¥¸ÄÌÃΤò¼õ¿®¤¹¤ë¤è¤¦¤ËÅÐÏ¿¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤ë¡£
-ÄÌÃΤò¼õ¤±¤¿¥×¥í¥»¥¹¤¬¼¡¤ÎÄÌÃΤâ¼õ¿®¤·¤¿¤¤¾ì¹ç¤Ï¡¢
+通知は一度だけ行われる。通知が送られた後は、通知要求の登録は削除され、
+別のプロセスがメッセージ通知を受信するように登録できるようになる。
+通知を受けたプロセスが次の通知も受信したい場合は、
.BR mq_notify ()
-¤ò»È¤Ã¤Æ¤½¤Î¸å¤ÎÄÌÃΤâ¼õ¤±¤ë¤è¤¦¤ËÍ׵᤹¤ë¤³¤È¤¬¤Ç¤¤ë¡£
+を使ってその後の通知も受けるように要求することができる。
.BR mq_notify ()
-¤òºÆÅٸƤӽФ¹¤Î¤Ï¡¢Æɤ߽Ф·¤Æ¤¤¤Ê¤¤¥á¥Ã¥»¡¼¥¸¤òÁ´ÉôÆɤ߽Ф·¤Æ
-¥¥å¡¼¤¬¶õ¤Ë¤Ê¤ëÁ°¤Ë¤¹¤Ù¤¤Ç¤¢¤ë
-(¥¥å¡¼¤«¤é¤Î¥á¥Ã¥»¡¼¥¸Æɤ߽Ф·¤ò¥¥å¡¼¤¬¶õ¤Ë¤Ê¤Ã¤¿»þ¤Ë
-Ää»ß (block) ¤»¤º¤Ë¹Ô¤¦¤Ë¤Ï¡¢¥¥å¡¼¤òÈóÄä»ß¥â¡¼¥É (non-blocking mode)
-¤ËÀßÄꤷ¤Æ¤ª¤¯¤È¤è¤¤)¡£
-.SH ÊÖ¤êÃÍ
-À®¸ù¤¹¤ë¤È¡¢
+を再度呼び出すのは、読み出していないメッセージを全部読み出して
+キューが空になる前にすべきである
+(キューからのメッセージ読み出しをキューが空になった時に
+停止 (block) せずに行うには、キューを非停止モード (non-blocking mode)
+に設定しておくとよい)。
+.SH 返り値
+成功すると、
.BR mq_notify ()
-¤Ï 0 ¤òÊÖ¤¹¡£¥¨¥é¡¼¤Î¾ì¹ç¡¢\-1 ¤òÊÖ¤·¡¢
+は 0 を返す。エラーの場合、\-1 を返し、
.I errno
-¤ò¥¨¥é¡¼¤ò¼¨¤¹ÃͤËÀßÄꤹ¤ë¡£
-.SH ¥¨¥é¡¼
+をエラーを示す値に設定する。
+.SH ã\82¨ã\83©ã\83¼
.TP
.B EBADF
.I mqdes
-¤Ë»ØÄꤵ¤ì¤¿¥Ç¥£¥¹¥¯¥ê¥×¥¿¤¬ÉÔÀµ¤Ç¤¢¤ë¡£
+に指定されたディスクリプタが不正である。
.TP
.B EBUSY
-ÊÌ¤Î¥×¥í¥»¥¹¤¬¤¹¤Ç¤Ë
-¤³¤Î¥á¥Ã¥»¡¼¥¸¥¥å¡¼¤ËÂФ¹¤ëÄÌÃΤò¼õ¿®¤¹¤ë¤è¤¦¤ËÅÐÏ¿¤·¤Æ¤¤¤ë¡£
+別のプロセスがすでに
+このメッセージキューに対する通知を受信するように登録している。
.TP
.B EINVAL
.I sevp\->sigev_notify
-¤¬µö²Ä¤µ¤ì¤¿ÃͤΤ¤¤º¤ì¤Ç¤â¤Ê¤¤¡£¤â¤·¤¯¤Ï
+が許可された値のいずれでもない。もしくは
.I sevp\->sigev_notify
-¤¬
+が
.B SIGEV_SIGNAL
-¤À¤¬
+だが
.I sevp\->sigev_signo
-¤¬Í¸ú¤Ê¥·¥°¥Ê¥ëÈÖ¹æ¤Ç¤Ï¤Ê¤¤¡£
+が有効なシグナル番号ではない。
.TP
.B ENOMEM
-ɬÍפʥá¥â¥ê¤¬¤Ê¤«¤Ã¤¿¡£
+必要なメモリがなかった。
.PP
-POSIX.1-2008 ¤Ç¤Ï¡¢
+POSIX.1-2008 では、
.I sevp
-¤¬ NULL ¤Ç¡¢¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤¬¥¥å¡¼
+ã\81\8c NULL ã\81§ã\80\81å\91¼ã\81³å\87ºã\81\97å\85\83ã\81®ã\83\97ã\83ã\82»ã\82¹ã\81\8cã\82ã\83¥ã\83¼
.I mqdes
-¤Ë´Ø¤¹¤ëÄÌÃΤò¼õ¿®¤¹¤ë¤è¤¦¤ËÅÐÏ¿¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¨¥é¡¼
+ã\81«é\96¢ã\81\99ã\82\8bé\80\9aç\9f¥ã\82\92å\8f\97ä¿¡ã\81\99ã\82\8bã\82\88ã\81\86ã\81«ç\99»é\8c²ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84å ´å\90\88ã\80\81ã\82¨ã\83©ã\83¼
.B EINVAL
-¤òÀ¸À®¤¹¤ë¤è¤¦¤Ê¼ÂÁõ¤ò¹Ô¤Ã¤Æ¤â¡Ö¤è¤¤¡×¤³¤È¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡£
-.\" Linux ¤Î¼ÂÁõ¤Ç¤Ï EINVAL ¤ÏÀ¸À®¤µ¤ì¤Ê¤¤
-.SH ½àµò
+を生成するような実装を行っても「よい」ことになっている。
+.\" Linux の実装では EINVAL は生成されない
+.SH 準拠
POSIX.1-2001.
-.SH Îã
-°Ê²¼¤Î¥×¥í¥°¥é¥à¤Ï¡¢
-¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¤¿ô¤Ç»ØÄꤵ¤ì¤¿Ì¾Á°¤Î¥á¥Ã¥»¡¼¥¸¥¥å¡¼¤Ø¤Î
-ÄÌÃÎÍ×µá¤òÅÐÏ¿¤·¡¢ÄÌÃΤϥ¹¥ì¥Ã¥É¤ÎºîÀ®¤Ë¤è¤Ã¤Æ¹Ô¤ï¤ì¤ë¡£
-¤½¤Î¥¹¥ì¥Ã¥É¤Ï¡¢¤½¤Î¥¥å¡¼¤«¤é¥á¥Ã¥»¡¼¥¸¤ò°ì¤ÄÆɤ߽Ф·¤Æ¤«¤é¡¢
-¥×¥í¥»¥¹¤ò½ªÎ»¤¹¤ë´Ø¿ô¤ò¼Â¹Ô¤¹¤ë¡£
+.SH 例
+以下のプログラムは、
+コマンドライン引き数で指定された名前のメッセージキューへの
+通知要求を登録し、通知はスレッドの作成によって行われる。
+そのスレッドは、そのキューからメッセージを一つ読み出してから、
+プロセスを終了する関数を実行する。
.nf
#include <pthread.h>
#define handle_error(msg) \\
do { perror(msg); exit(EXIT_FAILURE); } while (0)
-static void /* ¥¹¥ì¥Ã¥É³«»Ï´Ø¿ô */
+static void /* スレッド開始関数 */
tfunc(union sigval sv)
{
struct mq_attr attr;
void *buf;
mqd_t mqdes = *((mqd_t *) sv.sival_ptr);
- /* ºÇÂç¥á¥Ã¥»¡¼¥¸¥µ¥¤¥º¤ò·èÄꤷ¡¢
- ¥á¥Ã¥»¡¼¥¸¼õ¿®ÍѤΥХåե¡¤ò³ÎÊݤ¹¤ë */
+ /* 最大メッセージサイズを決定し、
+ メッセージ受信用のバッファを確保する */
if (mq_getattr(mqdes, &attr) == \-1)
handle_error("mq_getattr");
printf("Read %ld bytes from MQ\\n", (long) nr);
free(buf);
- exit(EXIT_SUCCESS); /* ¥×¥í¥»¥¹¤ò½ªÎ»¤¹¤ë */
+ exit(EXIT_SUCCESS); /* プロセスを終了する */
}
int
sev.sigev_notify = SIGEV_THREAD;
sev.sigev_notify_function = tfunc;
sev.sigev_notify_attributes = NULL;
- sev.sigev_value.sival_ptr = &mqdes; /* ¥¹¥ì¥Ã¥É´Ø¿ô¤ËÅϤ¹°ú¤¿ô */
+ sev.sigev_value.sival_ptr = &mqdes; /* スレッド関数に渡す引き数 */
if (mq_notify(mqdes, &sev) == \-1)
handle_error("mq_notify");
- pause(); /* ¥×¥í¥»¥¹¤Ï¥¹¥ì¥Ã¥É´Ø¿ô¤Ë¤è¤ê½ªÎ»¤µ¤ì¤ë */
+ pause(); /* プロセスはスレッド関数により終了される */
}
.fi
-.SH ´ØÏ¢¹àÌÜ
+.SH 関連項目
.BR mq_close (3),
.BR mq_getattr (3),
.BR mq_open (3),