mq_overview

Autres langues

Langue: ja

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

Section: 7 (Divers)

̾Á°

mq_overview - POSIX ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤Î³µÍ×

ÀâÌÀ

POSIX ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤ò»ÈÍѤ¹¤ë¤È¡¢¥×¥í¥»¥¹´Ö¤Ç ¥á¥Ã¥»¡¼¥¸¤Î·Á¤Ç¤Î¥Ç¡¼¥¿¤Î¤ä¤ê¼è¤ê¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë¡£ ¤³¤Î API ¤Ï System V ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤Î API (msgget(2), msgsnd(2), msgrcv(2) ¤Ê¤É) ¤È¤Ï°Û¤Ê¤ë¤â¤Î¤À¤¬¡¢Æ±Íͤε¡Ç½¤òÄ󶡤¹¤ë¡£

¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤ÎºîÀ®¤È¥ª¡¼¥×¥ó¤Ï mq_open(3) ¤ò»È¤Ã¤Æ¹Ô¤¦¡£¤³¤Î´Ø¿ô¤Ï ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼µ­½Ò»Ò (message queue descriptor) (mqd_t) ¤òÊÖ¤¹¡£¤³¤ì°Ê¹ß¤Î¥³¡¼¥ë¤Ç¤Ï¡¢¥ª¡¼¥×¥ó¤µ¤ì¤¿¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤Ï ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼µ­½Ò»Ò ¤ò»È¤Ã¤Æ»²¾È¤µ¤ì¤ë¡£ ³Æ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤Ï /somename ¤Î·Á¤Î̾Á°¤Ç¶èÊ̤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£ mq_open(3) ¤ËƱ¤¸Ì¾Á°¤òÅϤ¹¤³¤È¤Ç¡¢2¤Ä¤Î¥×¥í¥»¥¹¤ÇƱ°ì¤Î¥­¥å¡¼¤ò Áàºî¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£

¥á¥Ã¥»¡¼¥¸¤Î¥­¥å¡¼¤Ø¤ÎÁ÷¼õ¿®¤Ï mq_send(3) ¤È mq_receive(3) ¤ò»È¤Ã¤Æ¹Ô¤¦¡£¥×¥í¥»¥¹¤¬¥­¥å¡¼¤Î»ÈÍѤò½ª¤¨¤ë¤È¤­¤Ë¤Ï¡¢ mq_close(3) ¤ò»È¤Ã¤Æ¥­¥å¡¼¤ò¥¯¥í¡¼¥º¤¹¤ë¡£¥­¥å¡¼¤¬¤â¤Ï¤äÉÔÍפȤʤ俾ì¹ç¤Ë¤Ï¡¢ mq_unlink(3) ¤ò»È¤Ã¤Æ¥­¥å¡¼¤òºï½ü¤Ç¤­¤ë¡£¥­¥å¡¼¤Î°À­¤Ï mq_getattr(3) ¤Ç¼èÆÀ¤Ç¤­¡¢ (À©¸Â¤Ï¤¢¤ë¤¬) mq_setattr(3) ¤ÇÊѹ¹¤Ç¤­¤ë¡£ mq_notify(3) ¤ò»È¤¦¤³¤È¤Ç¡¢¶õ¤Î¥­¥å¡¼¤Ø¤Î¥á¥Ã¥»¡¼¥¸ÅþÃå¤òÈóƱ´ü¤Ç ÄÌÃΤ¹¤ë¤è¤¦¤ËÍ׵᤹¤ë¤³¤È¤â¤Ç¤­¤ë¡£

¥á¥Ã¥»¡¼¥¸¥­¥å¡¼µ­½Ò»Ò¤Ï ¥ª¡¼¥×¥ó¥á¥Ã¥»¡¼¥¸¥­¥å¡¼µ­½Ò (open message queue description) ¤Ø¤Î»²¾È¤Ç¤¢¤ë (open(2) ¤â»²¾È)¡£ fork(2) ¼Â¹Ô¸å¤Ï¡¢»Ò¥×¥í¥»¥¹¤Ï¿Æ¥×¥í¥»¥¹¤Î¥á¥Ã¥»¡¼¥¸¥­¥å¡¼µ­½Ò»Ò¤Î¥³¥Ô¡¼¤ò·Ñ¾µ¤¹¤ë¡£ ¤³¤ì¤é¤Îµ­½Ò»Ò¤Ï¡¢¿Æ¥×¥í¥»¥¹¤ÎÂбþ¤¹¤ëµ­½Ò»Ò¤ÈƱ¤¸¥ª¡¼¥×¥ó¥á¥Ã¥»¡¼¥¸¥­¥å¡¼ µ­½Ò¤ò»²¾È¤·¤Æ¤¤¤ë¡£¿Æ¥×¥í¥»¥¹¤È»Ò¥×¥í¥»¥¹¤ÎÂбþ¤¹¤ëµ­½Ò»Ò¤Ï¡¢¥Õ¥é¥° (mq_flags) ¤ò¶¦Í­¤¹¤ë¡£¤Ê¤¼¤Ê¤é¡¢¥Õ¥é¥°¤Ï¥ª¡¼¥×¥ó¥á¥Ã¥»¡¼¥¸¥­¥å¡¼µ­½Ò¤Ë ´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤ë¤«¤é¤Ç¤¢¤ë¡£

³Æ¥á¥Ã¥»¡¼¥¸¤Ë¤Ï¤½¤ì¤¾¤ì Í¥ÀèÅÙ (priority) ¤¬¤¢¤ê¡¢¥á¥Ã¥»¡¼¥¸¤Î¼õ¿®¥×¥í¥»¥¹¤Ø¤ÎÇÛÁ÷¤Ï¾ï¤Ë Í¥ÀèÅ٤ι⤤¥á¥Ã¥»¡¼¥¸¤«¤é½ç¤Ë¹Ô¤ï¤ì¤ë¡£ ¥á¥Ã¥»¡¼¥¸¤ÎÍ¥ÀèÅÙ¤Ï 0 (ÄãÍ¥Àè) ¤«¤é sysconf(_SC_MQ_PRIO_MAX) - 1 (¹âÍ¥Àè) ¤ÎÃͤò»ý¤Ä¡£ Linux ¤Ç¤Ï¡¢ sysconf(_SC_MQ_PRIO_MAX) ¤Ï 32768 ¤òÊÖ¤¹¤¬¡¢ POSIX.1-2001 ¤ÇÍ׵ᤵ¤ì¤Æ¤¤¤ë¤Î¤Ï 0 ¤«¤é 31 ¤Þ¤Ç¤ÎÍ¥ÀèÅÙ¤ò ¼ÂÁõ¤¹¤ë¤³¤È¤À¤±¤Ç¤¢¤ê¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ¤Ï¤³¤ÎÈϰϤÎÍ¥ÀèÅÙ¤·¤« Âбþ¤·¤Æ¤¤¤Ê¤¤¡£

¥é¥¤¥Ö¥é¥ê¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤È¥·¥¹¥Æ¥à¥³¡¼¥ë

¤Û¤È¤ó¤É¤Î¾ì¹ç¡¢¾åµ­¤Î mq_*() ¥é¥¤¥Ö¥é¥ê¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¡¢Æ±¤¸Ì¾Á°¤Î²¼°ÌÁؤΥ·¥¹¥Æ¥à¥³¡¼¥ë¤ò »È¤Ã¤Æ¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¡£¤³¤ÎÏÈÁȤߤˤ¢¤Æ¤Ï¤Þ¤é¤Ê¤¤¤â¤Î¤ò °Ê²¼¤Îɽ¤Ë¼¨¤¹¡£
Library interface System call
mq_close(3) close(2)
mq_getattr(3) mq_getsetattr(2)
mq_open(3) mq_open(2)
mq_receive(3) mq_timedreceive(2)
mq_send(3) mq_timedsend(2)
mq_setattr(3) mq_getsetattr(2)
mq_timedreceive(3) mq_timedreceive(2)
mq_timedsend(3) mq_timedsend(2)
mq_unlink(3) mq_unlink(2)

Linux ¸ÇÍ­¤Î¾ÜºÙ»ö¹à

¥Ð¡¼¥¸¥ç¥ó

Linux ¤Ç¤Ï POSIX ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤Ï¥«¡¼¥Í¥ë 2.6.6 °Ê¹ß¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¡£ glibc ¤Ç¤Ï¥Ð¡¼¥¸¥ç¥ó 2.3.4 °Ê¹ß¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¡£

¥«¡¼¥Í¥ë¤ÎÀßÄê

POSIX ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤Î¥µ¥Ý¡¼¥È¤Ï¡¢¥«¡¼¥Í¥ë¤ÎÀßÄê (configuration) ¥ª¥×¥·¥ç¥ó CONFIG_POSIX_MQUEUE ¤ÇÀßÄê²Äǽ¤Ç¤¢¤ë¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç¤ÏÍ­¸ú¤Ç¤¢¤ë¡£

»ý³À­

POSIX ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤Ï¥«¡¼¥Í¥ëÆâ¤ÇÊÝ»ý¤µ¤ì¤ë¡£ mq_unlink(3) ¤Çºï½ü¤µ¤ì¤Ê¤±¤ì¤Ð¡¢¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤Ï ¥·¥¹¥Æ¥à¤¬¥·¥ã¥Ã¥È¥À¥¦¥ó¤µ¤ì¤ë¤Þ¤Ç¸ºß¤·Â³¤±¤ë¡£

¥ê¥ó¥¯

POSIX ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼ API ¤ò»ÈÍѤ·¤¿¥×¥í¥°¥é¥à¤Ï cc -lrt ¤Ç¥³¥ó¥Ñ¥¤¥ë¤·¡¢¥ê¥¢¥ë¥¿¥¤¥à¥é¥¤¥Ö¥é¥ê librt ¤È¥ê¥ó¥¯¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£

/proc ¥¤¥ó¥¿¥Õ¥§¡¼¥¹

°Ê²¼¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò»È¤Ã¤Æ¡¢POSIX ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤¬¾ÃÈñ¤¹¤ë¥«¡¼¥Í¥ë ¥á¥â¥ê¤ÎÎ̤òÀ©¸Â¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£
/proc/sys/fs/mqueue/msg_max
¤³¤Î¥Õ¥¡¥¤¥ë¤ò»È¤Ã¤Æ¡¢°ì¤Ä¤Î¥­¥å¡¼¤ËÆþ¤ì¤é¤ì¤ë¥á¥Ã¥»¡¼¥¸¤ÎºÇÂç¿ô¤Î ¾å¸ÂÃͤò»²¾È¤·¤¿¤êÊѹ¹¤·¤¿¤ê¤Ç¤­¤ë¡£¤³¤ÎÃͤϡ¢ mq_open(3) ¤ËÅϤ¹ attr->mq_maxmsg °ú¤­¿ô¤ËÂФ¹¤ë¾å¸ÂÃͤȤ·¤Æµ¡Ç½¤¹¤ë¡£ msg_max ¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤª¤è¤ÓºÇ¾®ÃÍ¤Ï 10 ¤Ç¤¢¤ë; ¾å¸Â¤Ï¡ÖËä¤á¹þ¤ß¤Î¸ÇÄêÃÍ¡×(HARD_MAX) ¤Ç (131072 / sizeof(void *)) (Linux/86 ¤Ç¤Ï 32768) ¤Ç¤¢¤ë¡£ ¤³¤Î¾å¸Â¤ÏÆø¢¥×¥í¥»¥¹ (CAP_SYS_RESOURCE) ¤Ç¤Ï̵»ë¤µ¤ì¤ë¤¬¡¢Ëä¤á¹þ¤ß¤Î¸ÇÄêÃͤˤè¤ë¾å¸Â¤Ï ¤É¤ó¤Ê¾ì¹ç¤Ë¤Ç¤âŬÍѤµ¤ì¤ë¡£
/proc/sys/fs/mqueue/msgsize_max
¤³¤Î¥Õ¥¡¥¤¥ë¤ò»È¤Ã¤Æ¡¢¥á¥Ã¥»¡¼¥¸¤ÎºÇÂ祵¥¤¥º¤Î¾å¸ÂÃͤò 
»²¾È¤·¤¿¤êÊѹ¹¤·¤¿¤ê¤Ç¤­¤ë¡£    
¤³¤ÎÃͤϡ¢      
mq_open(3) ¤ËÅϤ¹      
attr.mq_msgsize  °ú¤­¿ô¤ËÂФ¹¤ë¾å¸ÂÃͤȤ·¤Æµ¡Ç½¤¹¤ë¡£  
msgsize_max      ¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤª¤è¤ÓºÇ¾®ÃÍ¤Ï 8192 ¥Ð¥¤¥È¤Ç¤¢¤ë;       
¾å¸Â¤Ï INT_MAX (Linux/86 ¤Ç¤Ï 2147483647) ¤Ç¤¢¤ë¡£      
¤³¤Î¾å¸Â¤ÏÆø¢¥×¥í¥»¥¹  
(CAP_SYS_RESOURCE) ¤Ç¤Ï̵»ë¤µ¤ì¤ë¡£
/proc/sys/fs/mqueue/queues_max
¤³¤Î¥Õ¥¡¥¤¥ë¤ò»È¤Ã¤Æ¡¢ºîÀ®¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤Î¿ô¤Ë       
ÂФ¹¤ë¥·¥¹¥Æ¥àÁ´ÂΤǤÎÀ©¸Â¤ò»²¾È¤·¤¿¤êÊѹ¹¤·¤¿¤ê¤Ç¤­¤ë¡£        
°ìÅÙ¤³¤Î¾å¸Â¤Ë㤹¤ë¤È¡¢¿·¤·¤¤¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤òºîÀ®¤Ç¤­¤ë¤Î¤Ï  
Æø¢¥×¥í¥»¥¹    
(CAP_SYS_RESOURCE) ¤À¤±¤È¤Ê¤ë¡£        
queues_max       ¤Î¥Ç¥Õ¥©¥ë¥ÈÃÍ¤Ï 256 ¤Ç¤¢¤ê¡¢ 
0 ¤«¤é INT_MAX ¤ÎÈϰϤÎǤ°Õ¤ÎÃͤËÊѹ¹¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£

¥ê¥½¡¼¥¹À©¸Â

¥ê¥½¡¼¥¹¾å¸Â RLIMIT_MSGQUEUE ¤Ï¡¢¥×¥í¥»¥¹¤Î¼Â UID ¤ËÂбþ¤¹¤ëÁ´¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤¬¾ÃÈñ¤¹¤ë ¥á¥â¥ê¶õ´Ö¤ÎÎ̤ËÂФ·¤Æ¾å¸Â¤òÀßÄꤹ¤ë¡£ getrlimit(2) ¤ò»²¾È¡£

¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¡¦¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à¤Î¥Þ¥¦¥ó¥È

Linux ¤Ç¤Ï¡¢¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤Ï²¾ÁÛ¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥àÆâ¤ËºîÀ®¤µ¤ì¤ë (¾¤Î¼ÂÁõ¤Ç¤âƱÍͤε¡Ç½¤¬Ä󶡤µ¤ì¤Æ¤¤¤ë¤â¤Î¤â¤¢¤ë¤¬¡¢ ¾ÜºÙ¤Ï°ã¤Ã¤Æ¤¤¤ë¤À¤í¤¦)¡£ °Ê²¼¤Î¥³¥Þ¥ó¥É¤ò»È¤¦¤³¤È¤Ç¡¢¤³¤Î¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à¤ò¥Þ¥¦¥ó¥È¤Ç¤­¤ë:



$ mkdir /dev/mqueue

$ mount -t mqueue none /dev/mqueue



¥Þ¥¦¥ó¥È¤·¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Î¥¹¥Æ¥£¥Ã¥­¡¼¥Ó¥Ã¥È (sticky bit) ¤Ï ¼«Æ°Åª¤Ë¥ª¥ó¤È¤Ê¤ë¡£

¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¡¦¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à¤Î¥Þ¥¦¥ó¥È¸å¤Ï¡¢¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ Ä̾ï»È¤¦¥³¥Þ¥ó¥É (Î㤨¤Ð ls(1) ¤ä rm(1)) ¤ò»È¤Ã¤Æ¡¢¥·¥¹¥Æ¥à¾å¤Î¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤òɽ¼¨¤·¤¿¤ê Áàºî¤·¤¿¤ê¤Ç¤­¤ë¡£

¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î³Æ¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ¤Ï 1¹Ô¤Ç¤¢¤ê¡¢ ¥­¥å¡¼¤Ë´Ø¤¹¤ë¾ðÊó¤¬É½¼¨¤µ¤ì¤ë¡£




$ ls /dev/mqueue/mymq

QSIZE:129     NOTIFY:2    SIGNO:0    NOTIFY_PID:8260

$ mount -t mqueue none /dev/mqueue



³Æ¥Õ¥£¡¼¥ë¥É¤Î¾ÜºÙ¤Ï°Ê²¼¤ÎÄ̤ê¤Ç¤¢¤ë:
QSIZE
¥­¥å¡¼¤ËÆþ¤Ã¤Æ¤¤¤ëÁ´¥á¥Ã¥»¡¼¥¸¤Î¹ç·×¥Ð¥¤¥È¿ô¡£
NOTIFY_PID
¤³¤ÎÃͤ¬ 0 °Ê³°¤Î¾ì¹ç¡¢¤³¤ÎÃͤΠPID ¤ò»ý¤Ä¥×¥í¥»¥¹¤¬ mq_notify(3) ¤ò»È¤Ã¤Æ¡¢ÈóƱ´ü¤Î¥á¥Ã¥»¡¼¥¸ÄÌÃΤò¹Ô¤¦¤è¤¦¤ËÀßÄꤷ¤¿¤³¤È¤ò¼¨¤¹¡£ ¤É¤Î¤è¤¦¤ËÄÌÃΤ¬¹Ô¤ï¤ì¤ë¤«¤Ï¡¢°Ê²¼¤Î¥Õ¥£¡¼¥ë¥É¤Ë¤è¤ê·èÄꤵ¤ì¤ë¡£
NOTIFY
ÄÌÃÎÊýË¡: 0 ¤Ï SIGEV_SIGNAL; 1 ¤Ï SIGEV_NONE; 2 ¤Ï SIGEV_THREAD
SIGNO
SIGEV_SIGNAL ¤Ë»ÈÍѤµ¤ì¤ë¥·¥°¥Ê¥ëÈֹ档

¥á¥Ã¥»¡¼¥¸¥­¥å¡¼µ­½Ò»Ò¤Î¥Ý¡¼¥ê¥ó¥°

Linux ¤Ç¤Ï¡¢¥á¥Ã¥»¡¼¥¸¥­¥å¡¼µ­½Ò»Ò¤Ï¼ÂºÝ¤Ï¥Õ¥¡¥¤¥ëµ­½Ò»Ò (file descriptor) ¤Ç¤¢¤ê¡¢ select(2), poll(2), epoll(7) ¤ò»È¤Ã¤Æ´Æ»ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£ ¤³¤Îµ¡Ç½¤Î°Ü¿¢À­¤Ï¤Ê¤¤¡£

½àµò

POSIX.1-2001.

Ãí°Õ

System V ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼ (msgget(2), msgsnd(2), msgrcv(2) ¤Ê¤É) ¤Ï¥×¥í¥»¥¹´Ö¤Ç¥á¥Ã¥»¡¼¥¸¤ò¤ä¤ê¼è¤ê¤¹¤ë¤¿¤á¤Î¸Å¤¤ API ¤Ç¤¢¤ë¡£ POSIX ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤Ï System V ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤è¤ê¤â¤¦¤Þ¤¯ À߷פµ¤ì¤¿¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Æ¤¤¤ë¡£ °ìÊý¤Ç¡¢POSIX ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤Ï System V ¥á¥Ã¥»¡¼¥¸¥­¥å¡¼¤ÈÈæ¤Ù¤ë¤È ÍøÍѤǤ­¤ë¥·¥¹¥Æ¥à¤¬¾¯¤Ê¤¤ (Æäˡ¢¸Å¤¤¥·¥¹¥Æ¥à¤Ç¤Ï¾¯¤Ê¤¤)¡£

Îã

³Æ¼ï¤Î¥á¥Ã¥»¡¼¥¸¥­¥å¡¼´Ø¿ô¤ò»ÈÍѤ·¤¿Î㤬 mq_notify(3) ¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¡£

´ØÏ¢¹àÌÜ

getrlimit(2), mq_getsetattr(2), mq_close(3), mq_getattr(3), mq_notify(3), mq_open(3), mq_receive(3), mq_send(3), mq_unlink(3), poll(2), select(2), epoll(4)