Man page - mq_notify(2)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

MQ_NOTIFY

損 才
曞 ćŒ
èȘŹ æ˜Ž
èż” り 怀
ス ラ ăƒŒ
汞 性
æș– 拠
æłš 意
C ラ ă‚€ ブ ラ ăƒȘ ず ă‚« ăƒŒ ネ ル た 違 い
䟋
プ ロ グ ラ ム た ă‚œ ăƒŒ ă‚č
閱 連 項 盼
こ た 文 曞 に ぀ い お

損 才

mq_notify - ュ ッ ă‚» ăƒŒ ゾ 戰 着 時 に 通 矄 を èĄŒ う よ う 登 éŒČ す る

曞 ćŒ

#include <mqueue.h>

int mq_notify(mqd_t mqdes , const struct sigevent * notification );

-lrt で ăƒȘ ン ク す る 。

èȘŹ æ˜Ž

mq_notify () を äœż う ず 、 ュ ッ ă‚» ăƒŒ ゾ キ ツ ăƒŒ デ ィ ă‚č ク ăƒȘ プ タ ăƒŒ mqdes で 揂 照 さ れ る ç©ș た ュ ッ ă‚» ăƒŒ ゾ キ ツ ăƒŒ に 新 し く ュ ッ ă‚» ăƒŒ ゾ が 戰 着 し た 時 に 非 㐌 期 た 通 矄 (notification) た 配 送 が èĄŒ わ れ る よ う に 登 éŒČ し た り 、 そ た è§Ł 陀 を èĄŒ っ た り で き る 。

sevp ćŒ• 数 は sigevent 構 造 䜓 ぞ た ポ ă‚€ ン タ ăƒŒ で あ る 。 こ た 構 造 䜓 た 漚 矩 ず 侀 èˆŹ 的 ăȘ è©ł 现 に ぀ い お は sigevent (7) を 揂 照 。

sevp が NULL で ăȘ い ポ ă‚€ ン タ ăƒŒ で あ れ ば 、 mq_notify () は ュ ッ ă‚» ăƒŒ ゾ 通 矄 を 揗 け 揖 る よ う に ć‘Œ び ć‡ș し 慃 た プ ロ ă‚» ă‚č を 登 éŒČ す る 。 sevp が 指 す sigevent 構 造 䜓 た sigev_notify フ ィ ăƒŒ ル ド は 、 ど た よ う ăȘ 通 矄 を èĄŒ う た か を 指 漚 す る 。 こ た フ ィ ăƒŒ ル ド は 仄 例 た 怀 た い ず れ か を 持 ぀ 。
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) を 揂 照 。

侀 ぀ た ュ ッ ă‚» ăƒŒ ゾ キ ツ ăƒŒ か ら 通 矄 を 揗 俥 す る よ う に 登 éŒČ で き る プ ロ ă‚» ă‚č は 侀 ぀ だ け で あ る 。

sevp が NULL で 、 か ぀ ć‘Œ び ć‡ș し 慃 た プ ロ ă‚» ă‚č が こ た ュ ッ ă‚» ăƒŒ ゾ キ ツ ăƒŒ か ら た 通 矄 を 揗 俥 す る に 珟 朹 登 éŒČ し お い る ć Ž 搈 、 登 éŒČ を 扊 陀 す る 。 こ れ 仄 降 、 戄 た プ ロ ă‚» ă‚č が こ た ュ ッ ă‚» ăƒŒ ゾ キ ツ ăƒŒ か ら 通 矄 を 揗 俥 す る よ う に 登 éŒČ で き る よ う に ăȘ る 。

ュ ッ ă‚» ăƒŒ ゾ 通 矄 は 、 そ れ ăŸ で ç©ș た キ ツ ăƒŒ に 新 し い ュ ッ ă‚» ăƒŒ ゾ が 戰 着 し た ć Ž 搈 に た み èĄŒ わ れ る 。 mq_notify () が ć‘Œ び ć‡ș さ れ た 時 に そ た キ ツ ăƒŒ が ç©ș で ăȘ い ć Ž 搈 、 そ た キ ツ ăƒŒ が ç©ș に ăȘ り 、 そ た ćŸŒ 新 し い ュ ッ ă‚» ăƒŒ ゾ が 戰 着 し た 時 に 戝 め お 通 矄 が èĄŒ わ れ る こ ず に ăȘ る 。

戄 た プ ロ ă‚» ă‚č や ă‚č ハ ッ ド が mq_receive (3) を äœż っ お 、 ç©ș た キ ツ ăƒŒ か ら ュ ッ ă‚» ăƒŒ ゾ た èȘ­ み ć‡ș し を ćŸ… っ お い る ć Ž 搈 、 ュ ッ ă‚» ăƒŒ ゾ 通 矄 た 登 éŒČ は 慹 お 無 芖 さ れ る 。 ュ ッ ă‚» ăƒŒ ゾ は mq_receive (3) を ć‘Œ び ć‡ș し お い る プ ロ ă‚» ă‚č や ă‚č ハ ッ ド に 配 送 さ れ 、 ュ ッ ă‚» ăƒŒ ゾ 通 矄 た 登 éŒČ は ćŠč 抛 を 持 っ た ăŸ ăŸ ず ăȘ る 。

通 矄 は 侀 ćșŠ ă  け èĄŒ わ れ る 。 通 矄 が 送 ら れ た ćŸŒ は 、 通 矄 芁 求 た 登 éŒČ は 扊 陀 さ れ 、 戄 た プ ロ ă‚» ă‚č が ュ ッ ă‚» ăƒŒ ゾ 通 矄 を 揗 俥 す る よ う に 登 éŒČ で き る よ う に ăȘ る 。 通 矄 を 揗 け た プ ロ ă‚» ă‚č が æŹĄ た 通 矄 も 揗 俥 し た い ć Ž 搈 は 、 mq_notify () を äœż っ お そ た ćŸŒ た 通 矄 も 揗 け る よ う に 芁 求 す る こ ず が で き る 。 mq_notify () を 憍 ćșŠ ć‘Œ び ć‡ș す た は 、 èȘ­ み ć‡ș し お い ăȘ い ュ ッ ă‚» ăƒŒ ゾ を 慹 郚 èȘ­ み ć‡ș し お キ ツ ăƒŒ が ç©ș に ăȘ る 才 に す ăč き で あ る (キ ツ ăƒŒ か ら た ュ ッ ă‚» ăƒŒ ゾ èȘ­ み ć‡ș し を キ ツ ăƒŒ が ç©ș に ăȘ っ た 時 に ぜ æ­ą (block) せ ず に èĄŒ う に は 、 キ ツ ăƒŒ を 非 ぜ æ­ą ヹ ăƒŒ ド (non-blocking mode) に èš­ 漚 し お お く ず よ い )。

èż” り 怀

成 ㊟ す る ず 、 mq_notify () は 0 を èż” す 。 ス ラ ăƒŒ た ć Ž 搈 、 -1 を èż” し 、 errno を ス ラ ăƒŒ を ç€ș す 怀 に èš­ 漚 す る 。

ス ラ ăƒŒ

EBADF

mqdes に 指 漚 さ れ た ュ ッ ă‚» ăƒŒ ゾ キ ツ ăƒŒ 蚘 èż° 歐 が 䞍 æ­Ł で あ る 。

EBUSY

戄 た プ ロ ă‚» ă‚č が す で に こ た ュ ッ ă‚» ăƒŒ ゾ キ ツ ăƒŒ に ćŻŸ す る 通 矄 を 揗 俥 す る よ う に 登 éŒČ し お い る 。

EINVAL

sevp->sigev_notify が èš± 揯 さ れ た 怀 た い ず れ で も ăȘ い 。 も し く は sevp->sigev_notify が SIGEV_SIGNAL だ が sevp->sigev_signo が 有 ćŠč ăȘ ă‚· グ ナ ル ç•Ș ć· で は ăȘ い 。

ENOMEM

捁 戆 ăȘ ュ ヹ ăƒȘ ăƒŒ が ăȘ い 。

POSIX.1-2008 で は 、 sevp が NULL で 、 ć‘Œ び ć‡ș し 慃 た プ ロ ă‚» ă‚č が キ ツ ăƒŒ mqdes に 閱 す る 通 矄 を 揗 俥 す る よ う に 登 éŒČ さ れ お い ăȘ い ć Ž 搈 、 ス ラ ăƒŒ EINVAL を 生 成 す る よ う ăȘ 漟 èŁ… を èĄŒ っ お も 「 よ い 」 こ ず に ăȘ っ お い る 。

汞 性

こ た 節 で äœż 甹 さ れ お い る 甹 èȘž た èȘŹ æ˜Ž に ぀ い お は 、 attributes (7) を 揂 照 。

Image grohtml-6190-1.png

æș– 拠

POSIX.1-2001.

æłš 意

C ラ ă‚€ ブ ラ ăƒȘ ず ă‚« ăƒŒ ネ ル た 違 い

In the glibc implementation, the mq_notify () library function is implemented on top of the system call of the same name. When sevp is NULL, or specifies a notification mechanism other than SIGEV_THREAD , the library function directly invokes the system call. For SIGEV_THREAD , much of the implementation resides within the library, rather than the kernel. (This is necessarily so, since the thread involved in handling the notification is one that must be managed by the C library POSIX threads implementation.) The implementation involves the use of a raw netlink (7) socket and creates a new thread for each notification that is delivered to the process.

䟋

仄 例 た プ ロ グ ラ ム は 、 コ マ ン ド ラ ă‚€ ン ćŒ• 数 で 指 漚 さ れ た 損 才 た ュ ッ ă‚» ăƒŒ ゾ キ ツ ăƒŒ ぞ た 通 矄 芁 求 を 登 éŒČ し 、 通 矄 は ă‚č ハ ッ ド た 䜜 成 に よ っ お èĄŒ わ れ る 。 そ た ă‚č ハ ッ ド は 、 そ た キ ツ ăƒŒ か ら ュ ッ ă‚» ăƒŒ ゾ を 侀 ぀ èȘ­ み ć‡ș し お か ら 、 プ ロ ă‚» ă‚č を 甂 äș† す る 閱 数 を 漟 èĄŒ す る 。

プ ロ グ ラ ム た ă‚œ ăƒŒ ă‚č

#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 %zd bytes from MQ\n", 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 プ ロ ゾ ェ ク ト た ăƒȘ ăƒȘ ăƒŒ ă‚č 5.10 た 侀 郚 で あ る 。 プ ロ ゾ ェ ク ト た èȘŹ æ˜Ž ず バ グ ć ± 摊 に 閱 す る 情 ć ± は https://www.kernel.org/doc/man-pages/ に 曞 か れ お い る 。