mq_notify

Autres langues

Langue: ja

Version: 2006-02-25 (openSuse - 09/10/07)

Autres sections - même nom

Section: 3 (Bibliothèques de fonctions)

̾Á°

mq_notify - ¥á¥Ã¥»¡¼¥¸ÅþÃå»þ¤ËÄÌÃΤò¹Ô¤¦¤è¤¦ÅÐÏ¿¤¹¤ë

½ñ¼°


#include <mqueue.h>



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

ÀâÌÀ

mq_notify() ¤ò»È¤¦¤È¡¢¥Ç¥£¥¹¥¯¥ê¥×¥¿ mqdes ¤Ç»²¾È¤µ¤ì¤ë¶õ¤Î¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤Ë¿·¤·¤¯¥á¥Ã¥»¡¼¥¸¤¬ÅþÃ夷¤¿»þ¤Ë ÈóƱ´ü¤ÎÄÌÃÎ (notification) ¤ÎÇÛÁ÷¤ÎÅÐÏ¿/²ò½ü¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë¡£

notification °ú¤­¿ô¤Ï sigevent ¹½Â¤ÂΤؤΥݥ¤¥ó¥¿¤Ç¤¢¤ë¡£ sigevent ¹½Â¤ÂΤϰʲ¼¤Î¤è¤¦¤Ê´¶¤¸¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë:




union sigval {                /* Data passed with notification */

    int     sival_int;        /* Integer value */

    void   *sival_ptr;        /* Pointer value */

};



struct sigevent {

    int    sigev_notify;      /* Notification method */

    int    sigev_signo;       /* Notification signal */

    union sigval sigev_value; /* Data passed with notification */

    void (*sigev_notify_function) (union sigval);

                              /* Function for thread notification */

    void  *sigev_notify_attributes;

                              /* Thread function attributes */

};

notification ¤¬ NULL ¤Ç¤Ê¤¤¥Ý¥¤¥ó¥¿¤Ç¤¢¤ì¤Ð¡¢ mq_notify() ¤Ï¥á¥Ã¥»¡¼¥¸ÄÌÃΤò¼õ¤±¼è¤ë¤è¤¦¤Ë¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤òÅÐÏ¿¤¹¤ë¡£ notification ¤¬»Ø¤¹ sigevent ¤Î sigev_notify ¥Õ¥£¡¼¥ë¥É¤Ï¡¢¤É¤Î¤è¤¦¤ÊÄÌÃΤò¹Ô¤¦¤Î¤«¤ò»ØÄꤹ¤ë¡£ ¤³¤Î¥Õ¥£¡¼¥ë¥É¤Ï°Ê²¼¤ÎÃͤΤ¤¤º¤ì¤«¤ò»ý¤Ä¡£

SIGEV_NONE
¡Ö¶õ¤Î (null)¡×¤ÎÄÌÃÎ: ¸Æ¤Ó½Ð¤·¸µ¤Î¥×¥í¥»¥¹¤òÄÌÃΤΰ¸Àè¤È¤·¤ÆÅÐÏ¿¤¹¤ë¤¬¡¢ ¼ÂºÝ¤Ë¤Ï¥á¥Ã¥»¡¼¥¸¤¬ÅþÃ夷¤¿»þ¤ËÄÌÃΤÏÁ÷¤é¤ì¤Ê¤¤¡£
SIGEV_SIGNAL
sigev_signo ¤Ç»ØÄꤵ¤ì¤¿¥·¥°¥Ê¥ë¤òÁ÷¤Ã¤Æ¡¢¥×¥í¥»¥¹¤ËÄÌÃΤ¹¤ë¡£ sigaction(2) ¤Î SA_SIGINFO ¥Õ¥é¥°¤ÇÅÐÏ¿¤µ¤ì¤¿¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ç¤½¤Î¥·¥°¥Ê¥ë¤¬Ê᪤µ¤ì¤¿¾ì¹ç¡¢ ¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤ÎÂèÆó°ú¤­¿ô¤È¤·¤ÆÅϤµ¤ì¤ë siginfo_t ¹½Â¤ÂΤγƥե£¡¼¥ë¥É¤Ï°Ê²¼¤Î¤è¤¦¤ËÀßÄꤵ¤ì¤ë¡£ si_code ¤Ë¤Ï SI_MESGQ ¤¬ÀßÄꤵ¤ì¤ë¡£ si_signo ¤Ë¤Ï¥·¥°¥Ê¥ëÈֹ椬ÀßÄꤵ¤ì¤ë¡£ si_value ¤Ë¤Ï notification->sigev_value ¤Ç»ØÄꤷ¤¿Ãͤ¬ÀßÄꤵ¤ì¤ë¡£ si_pid ¤Ë¤Ï¥á¥Ã¥»¡¼¥¸¤òÁ÷¿®¤·¤¿¥×¥í¥»¥¹¤Î PID ¤¬¡¢ si_uid ¤Ë¤ÏÁ÷¿®¥×¥í¥»¥¹¤Î¼Â¥æ¡¼¥¶ ID ¤¬ÀßÄꤵ¤ì¤ë¡£ sigwaitinfo(2) ¤ò»È¤Ã¤Æ¥·¥°¥Ê¥ë¤ò¼õ¿®¤¹¤ë¾ì¹ç¤â¡¢Æ±¤¸¾ðÊó¤¬ÆÀ¤é¤ì¤ë¡£
SIGEV_THREAD
¿·¤·¤¤¥¹¥ì¥Ã¥É¤Î³«»Ï´Ø¿ô¤È¤·¤Æ notification->sigev_thread_function ¤òµ¯Æ°¤¹¤ë¤³¤È¤ÇÄÌÃΤò¹Ô¤¦¡£ µ¯Æ°»þ¤Î´Ø¿ô¤Î°ú¤­¿ô¤È¤·¤Æ¤Ï notification->sigev_value ¤À¤±¤¬ÅϤµ¤ì¤ë¡£ notification->sigev_notify_attributes ¤Ï¡¢NULL °Ê³°¤Î¾ì¹ç¡¢ ¤½¤Î¥¹¥ì¥Ã¥É¤Î°À­¤òÄêµÁ¤¹¤ë pthread_attr_t ¹½Â¤ÂΤؤΥݥ¤¥ó¥¿¤È¤Ê¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ë¡£

°ì¤Ä¤Î¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤«¤éÄÌÃΤò¼õ¿®¤¹¤ë¤è¤¦¤ËÅÐÏ¿¤Ç¤­¤ë¥×¥í¥»¥¹¤Ï °ì¤Ä¤À¤±¤Ç¤¢¤ë¡£

notification ¤¬ 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
notification->sigev_notify ¤¬µö²Ä¤µ¤ì¤¿ÃͤΤ¤¤º¤ì¤Ç¤â¤Ê¤¤¡£¤â¤·¤¯¤Ï notification->sigev_notify ¤¬ SIGEV_SIGNAL ¤À¤¬ notification->sigev_signo ¤¬Í­¸ú¤Ê¥·¥°¥Ê¥ëÈÖ¹æ¤Ç¤Ï¤Ê¤¤¡£
ENOMEM
ɬÍפʥá¥â¥ê¤¬¤Ê¤«¤Ã¤¿¡£

½àµò

POSIX.1-2001.

Îã

°Ê²¼¤Î¥×¥í¥°¥é¥à¤Ï¡¢ ¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¤­¿ô¤Ç»ØÄꤵ¤ì¤¿Ì¾Á°¤Î¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤Ø¤Î ÄÌÃÎÍ×µá¤òÅÐÏ¿¤·¡¢ÄÌÃΤϥ¹¥ì¥Ã¥É¤ÎºîÀ®¤Ç¹Ô¤ï¤ì¤ë¡£ ¤½¤Î¥¹¥ì¥Ã¥É¤Ï¡¢¤½¤Î¥­¥å¡¼¤«¤é¥á¥Ã¥»¡¼¥¸¤ò°ì¤ÄÆɤ߽Ф·¤Æ¤«¤é¡¢ ¥×¥í¥»¥¹¤ò½ªÎ»¤¹¤ë´Ø¿ô¤ò¼Â¹Ô¤¹¤ë¡£



#include <pthread.h>

#include <mqueue.h>

#include <assert.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>



#define die(msg) { perror(msg); exit(EXIT_FAILURE); }



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) die("mq_getattr");

    buf = malloc(attr.mq_msgsize);

    if (buf == NULL) die("malloc");



    nr = mq_receive(mqdes, buf, attr.mq_msgsize, NULL);

    if (nr == -1) die("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 not;



    assert(argc == 2);



    mqdes = mq_open(argv[1], O_RDONLY);

    if (mqdes == (mqd_t) -1) die("mq_open");



    not.sigev_notify = SIGEV_THREAD;

    not.sigev_notify_function = tfunc;

    not.sigev_notify_attributes = NULL;

    not.sigev_value.sival_ptr = &mqdes;   /* ¥¹¥ì¥Ã¥É´Ø¿ô¤ËÅϤ¹°ú¤­¿ô */

    if (mq_notify(mqdes, &not) == -1) die("mq_notify");



    pause();    /* ¥×¥í¥»¥¹¤Ï¥¹¥ì¥Ã¥É´Ø¿ô¤Ë¤è¤ê½ªÎ»¤µ¤ì¤ë */

}

´ØÏ¢¹àÌÜ

mq_close(3), mq_getattr(3), mq_open(3), mq_receive(3), mq_send(3), mq_unlink(3), mq_overview(7)