IPC : ¸Þ½ÃÁö Å¥
ÃÑ ÆäÀÌÁö ¼ö : 3027

Àüü ÇÔ¼ö/¿ë¾î»çÀü
ÇöÀçÀ§Ä¡ : ¹Ì´Ï»çÀÌÆ®>½Ã½ºÅÛÇÁ·Î±×·¡¹Ö>IPC>MessageQueue


Contents

1 ¸Þ½ÃÁö Å¥¶õ
2 System V ¸Þ½ÃÁö Å¥
2.1 ¸Þ½ÃÁöÅ¥ÀÇ »ý¼º, »ç¿ë, Á¦¾î
2.2 ¸Þ½ÃÁöÅ¥ »ý¼º
2.3 ¸Þ½ÃÁöÅ¥¿¡ µ¥ÀÌŸ ¾²±â
2.4 ¸Þ½ÃÁöÅ¥ÀÇ µ¥ÀÌŸ °¡Á®¿À±â
2.5 ¿¹Á¦¸¦ ÅëÇØ ¾Ë¾Æº» ¸Þ½ÃÁöÅ¥
2.6 ¸Þ½ÃÁöÅ¥ÀÇ Á¦¾î
2.7 Á¤¸®
3 POSIX ¸Þ½ÃÁö Å¥
3.1 ¸Þ¼¼Áö Å¥ ÆÄÀÏ ½Ã½ºÅÛ ¸¸µé±â
3.2 ¸Þ¼¼Áö Å¥ »ý¼º
4 Âü°í¹®¼­

1 ¸Þ½ÃÁö Å¥¶õ

¸Þ½ÃÁöÅ¥´Â ¸Þ½ÃÁö¸¦ queue µ¥ÀÌŸ ±¸Á¶ ÇüÅ·Π°ü¸®ÇÑ´Ù. Å¥´Â ¼±ÀÔ¼±Ãâ(¸ÕÀú µé¾î°£°Ô ¸ÕÀú ³ª¿À´Â) µ¥ÀÌŸ ±¸Á¶¸¦ ¸»Çϸç, º¸ÅëÀÇ ÀºÇàⱸ ȤÀº ÀϹÝÀûÀÎ ÁÙ¼­±â¸¦ »ý°¢ÇÏ¸é µÈ´Ù. À̰ÍÀº ÈçÈ÷ FIFO(First in First Out)¶ó°í ºÒ¸®¿î´Ù(IPC ÀÇ FIFO ¼³ºñ¿Í È¥µ¿ÇÏÁö ¸»ÀÚ). À̰Ͱú ¹Ý´ëµÇ´Â µ¥ÀÌŸ ±¸Á¶¸¦ stack À̶ó°í Çϸç, Å¥¿Í ¹Ý´ë·Î °¡Àå ³ªÁß¿¡ µé¾î¿Â°Ô(°¡Àå ÃÖ±Ùµ¥ÀÌŸ) ¸ÕÀú ³ª¿À´Â ÇüŸ¦ °¡Áø´Ù.

ÀϹÝÀûÀÎ ¹è¿­À» Á¢±Ù¹æ¹ý¿¡ µû¶ó Ư¼öÇÏ°Ô ºÐ·ùÇѰÍÀ̶ó°í »ý°¢Çϱ⠹ٶõ´Ù.

¸Þ½ÃÁöÅ¥´Â Ä¿³Î¿¡¼­ Àü¿ªÀûÀ¸·Î °ü¸®µÇ¸ç(À̸¦Å׸é Ä¿³Î Àü¿ªº¯¼öÇüÅ·Î), ¸ðµç ÇÁ·Î¼¼½º¿¡¼­ Á¢±Ù°¡´ÉÇϵµ·Ï µÇ¾îÀÖÀ¸¹Ç·Î, ÇϳªÀÇ ¸Þ½ÃÁöÅ¥ ¼­¹ö°¡ Ä¿³Î¿¡ ¿äÃ»ÇØ¼­ ¸Þ½ÃÁöÅ¥¸¦ ÀÛ¼ºÇÏ°Ô µÇ¸é, ¸Þ½ÃÁöÅ¥ÀÇ Á¢±ÙÀÚ(½Äº°ÀÚ)¸¦ ¾Æ´Â ¸ðµç ÇÁ·Î¼¼¼­´Â µ¿ÀÏÇÑ ¸Þ½ÃÁöÅ¥¿¡ Á¢±ÙÇÔÀ¸·Î½á, µ¥ÀÌŸ¸¦ °øÀ¯ÇÒ¼ö ÀÖ°Ô µÈ´Ù.

¸Þ½ÃÁöÅ¥ÀÇ IPC·Î½áÀÇ Æ¯Â¡Àº ´Ù¸¥ °øÀ¯¹æ½Ä¿¡ ºñÇØ¼­ »ç¿ë¹æ¹ýÀÌ ¸Å¿ì Á÷°üÀûÀÌ°í °£´ÜÇÏ´Ù¶ó´Âµ¥ ÀÖ´Ù. ´Ù¸¥ ÄÚµåÀÇ ¼öÁ¤¾øÀÌ ´ÜÁö ¸îÁÙ¸¸ÀÇ Äڵ带 Ãß°¡½ÃÅ´À¸·Î½á °£´ÜÇÏ°Ô ¸Þ½ÃÁöÅ¥¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Ù.

¶ÇÇÑ µÚ¿¡¼­ ÀÚ¼¼È÷ ´Ù·ç°ÚÁö¸¸ ¸Þ½ÃÁöÀÇ type ¿¡ ÀÇÇØ¼­ ¿©·¯Á¾·ùÀÇ ¸Þ½ÃÁö¸¦ È¿°úÀûÀ¸·Î ´Ù·ê¼ö ÀÖ´Â ÀåÁ¡À» °¡Áö°í ÀÖ´Ù. ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ ÇϳªÀÇ ¸Þ½ÃÁöÅ¥¸¦ ¿¢¼¼½º ÇÒ¶§, °¢ ¸Þ½ÃÁö¿¡ type ¸¦ ÁÜÀ¸·Î½á °¢ ÇÁ·Î¼¼½º¿¡°Ô ÇÊ¿ä·ÎÇÏ´Â ¸Þ½ÃÁö¸¸À» °¡Á®°¡°Ô ÇÒ¼ö ÀÖ´Â »ó´çÈ÷ Æí¸®ÇÑ ±â´ÉÀ» Á¦°øÇÑ´Ù.

¶ÇÇÑ ±¸Á¶Ã¼¸¦ ¸ù¶¥ ³Ñ±æ¼ö ÀÖ°í, ÀÌ´Â µ¥ÀÌŸÀÇ »ç¿ëÀ» ¸Å¿ì ÆíÇÏ°Ô ¸¸µé¾îÁØ´Ù.

2 System V ¸Þ½ÃÁö Å¥

2.1 ¸Þ½ÃÁöÅ¥ÀÇ »ý¼º, »ç¿ë, Á¦¾î

¸Þ½ÃÁöÅ¥¸¦ »ý¼ºÇϰí, À̸¦ ÀÌ¿ë ¹× Á¶ÀÛÇϱâ À§Çؼ­ Unix ½Ã½ºÅÛÀº ´ÙÀ½°ú °°Àº ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù. ¾ÕÀ¸·ÎÀÇ ¼³¸íÀº ¾Æ·¡ÀÇ ÇÔ¼öµéÀ» ±âÁØÀ¸·Î ÀÌ·ç¾îÁö°Ô µÉ°ÍÀÌ´Ù.

#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 
 
int msgget (key_t key, int msgflg) 
int msgsnd (int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg) 
ssize_t msgrcv (int msqid, struct  msgbuf  *msgp,  size_t msgsz,  
                long msgtyp, int msgflg)  
 
Unix Ä¿³ÎÀº ¸Þ½ÃÁöÅ¥ Á¤º¸¸¦ À¯ÁöÇϱâ À§Çؼ­ msqid_ds ¶ó´Â º°µµÀÇ ±¸Á¶Ã¼¸¦ À¯ÁöÇÑ´Ù. msqid_ds ±¸Á¶Ã¼´Â /usr/include/bits/msq.h ¿¡ ¼±¾ðµÇ¾î ÀÖÀ¸¸ç ´ëÃæ ´ÙÀ½°ú °°Àº ±¸Á¶¸¦ °¡Áø´Ù

ÀÌ°Ç linux os ±âÁØÀ̸ç, Unix ¿¡ µû¶ó ¾à°£¾¿ ´Ù¸¦¼ö ÀÖ´Ù
struct msqid_ds 
{ 
    struct ipc_perm msg_perm; /* structure describing operation permission */ 
    __time_t msg_stime;       /* time of last msgsnd command */ 
    unsigned long int __unused1; 
    __time_t msg_rtime;       /* time of last msgrcv command */ 
    unsigned long int __unused2; 
    __time_t msg_ctime;       /* time of last change */ 
    unsigned long int __unused3; 
    unsigned long int __msg_cbytes; /* current number of bytes on queue */ 
    msgqnum_t msg_qnum;       /* number of messages currently on queue */ 
    msglen_t msg_qbytes;      /* max number of bytes allowed on queue */ 
    __pid_t msg_lspid;        /* pid of last msgsnd() */ 
    __pid_t msg_lrpid;        /* pid of last msgrcv() */ 
    unsigned long int __unused4; 
    unsigned long int __unused5; 
}; 
 
ÃÖÃÊ msgget ¸¦ ÀÌ¿ëÇØ¼­ Ä¿³Î¿¡ ¸Þ½ÃÁöÅ¥¸¦ ¿äûÇϸé, Ä¿³ÎÀº ÇØ´ç ¸Þ½ÃÁöÅ¥¸¦ À§ÇØ ¸Þ¸ð¸®¸¦ ÇÒ´çÇϰí, ¸Þ¸ð¸® °ü¸®¿Í ±×¹ÛÀÇ Á¤º¸ °ü¸®¸¦ À§ÇØ À§ÀÇ ±¸Á¶Ã¼¸¦ ¼¼ÆÃÇÏ°Ô µÈ´Ù.

2.2 ¸Þ½ÃÁöÅ¥ »ý¼º

¸Þ½ÃÁöÅ¥ÀÇ »ý¼º°ú ±âÁ¸¿¡ ÀÖ´ø ¸Þ½ÃÁöÅ¥ÀÇ ÂüÁ¶´Â msgget(2) ¸¦ ÀÌ¿ëÇØ¼­ ÀÌ·ç¾îÁø´Ù. ù¹øÂ° ¾Æ±Ô¸ÕÆ®ÀÎ key ´Â kernel ¿¡¼­ À¯ÀÏÇÑ ¸Þ½ÃÁöÅ¥¸¦ ¸¸µé°í ÂüÁ¶Çϱâ À§Çؼ­ »ç¿ëÇÏ´Â ½Äº°¹øÈ£À̸ç, msgflg ´Â ¸Þ½ÃÁöÅ¥¸¦ ¾î¶»°Ô »ý¼ºÇϰí ÂüÁ¶ÇÒÁö Çൿ¾ç ½ÄÀ» Á¤ÇØÁÖ±â À§ÇÑ ¾Æ±Ô¸ÕÆ®ÀÌ´Ù. key ´Â Àû´çÇÏ°Ô À¯ÀÏÇÑ int ÇüÀÇ ¼ýÀÚ¸¦ Á¤ÇØÁÖ¸é µÈ´Ù. msgflg ¿¡´Â IPC_CREAT¿Í IPC_EXCLµîÀÇ ½ÃÀÛµ¿ÀÛÀ» Á¤ÇØÁÙ¼ö ÀÖÀ¸¸ç, ÆÛ¹Ì¼ÇÀ» ÁöÁ¤ÇØ ÁÙ¼öµµ ÀÖ´Ù.
IPC_CREAT
¸Þ½ÃÁöÅ¥¸¦ »õ·Î »ý¼ºÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ¸¸¾à ±âÁ¸¿¡ key ·Î »ý¼±µÈ ¸Þ½ÃÁöÅ¥°¡ ÀÖ´Ù¸é ÇØ´ç ¸Þ½ÃÁöÅ¥ÀÇ ½Äº°ÀÚ¸¦ µÇµ¹·ÁÁØ´Ù.
IPC_EXCL
IPC_CREAT ¿Í ÇÔ²² ¾²À̸ç, IPC_EXCLÀÌ ÁöÁ¤µÇ¾î ÀÖÀ»°æ¿ì ÀÌ¹Ì key ·Î Á¸ÀçÇÏ´Â ¸Þ½ÃÁöÅ¥°¡ ÀÖ´Ù¸é, -1 À» ¸®ÅÏÇϰí errno ¸¦ ¼¼ÆÃÇÑ´Ù.

msgget ´Â ¼º°øÇÒ°æ¿ì ¸Þ½ÃÁöÅ¥¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Â int ÇüÀÇ ¸Þ½ÃÁöÅ¥ ½Äº°ÀÚ¸¦ µÇµ¹·ÁÁÖ¸ç, ÀÌÈķδ ÀÌ ¸Þ½ÃÁöÅ¥ ½Äº°ÀÚ¸¦ ÅëÇØ¼­ ÇÊ¿äÇÑ ÀÛ¾÷À» ÇÏ°Ô µÈ´Ù.

2.3 ¸Þ½ÃÁöÅ¥¿¡ µ¥ÀÌŸ ¾²±â

¸Þ½ÃÁö¸¦ º¸³»±â À§Çؼ­´Â msgsnd(2) ¸¦ »ç¿ëÇÑ´Ù. ù¹øÂ° ¾Æ±Ô¸ÕÆ®´Â msgget ¸¦ ÅëÇØ¼­ ¾ò¾î¿Â ¸Þ½ÃÁöÅ¥ ½Äº°ÀÚÀ̸ç, 2¹øÂ° ¾Æ±Ô¸ÕÆ®´Â ¸Þ½ÃÁöÅ¥¿¡ ³Ñ±â°íÀÚÇÏ´Â ±¸Á¶Ã¼, 3¹øÂ° ¾Æ±Ô¸ÕÆ®´Â 2¹øÂ° ¾Æ±Ô¸ÕÆ®ÀÎ ±¸Á¶Ã¼ÀÇ Å©±â, ¸¶Áö¸· ¾Æ±Ô¸ÕÆ®´Â ¸Þ½ÃÁöÀü´Þ ¿É¼ÇÀ¸·Î ºÀ¼âÇÒ°ÍÀÎÁö ¾Æ´Ï¸é ºñºÀ¼â·Î ¸Þ½ÃÁö¸¦ °áÁ¤Çϱâ À§Çؼ­ »ç¿ëµÈ´Ù.

2¹øÂ° ¾Æ±Ô¸ÕÆ®°¡ ¸Þ½ÃÁöÅ¥·Î Àü´ÞÇÒ ¸Þ½ÃÁö¶ó°í Çߴµ¥, À̰ÍÀº ±¸Á¶Ã¼·Î Àü´Þ µÇ¸ç, ´ÙÀ½°ú °°Àº ¸ð½ÀÀ» °¡Áö°Ô µÈ´Ù.
struct msgbuf 
{ 
    long mtype; 
    char mtext[255]; 
} 
 
À§ÀÇ ¸ð½ÀÀº ¸Þ½ÃÁö ±¸Á¶Ã¼ÀÇ ¸Å¿ì ÀüÇüÀûÀÎ ¸ð½ÀÀ¸·Î »ç½Ç¸â¹öº¯¼ö´Â Çʿ信 µû¶ó¼­ ¾ó¸¶µçÁö º¯°æµÉ¼ö ÀÖ´Ù. ´Ù¸¸ long mtype ¸¸ÀÌ Çʼö¿ä¼ÒÀÌ´Ù.

mtype ´Â ¸Þ½ÃÁöÀÇ Å¸ÀÔÀ¸·Î ¹Ýµå½Ã 0º¸´Ù ´õÅ« Á¤¼öÀÌ¿©¾ß ÇÑ´Ù. ¿ì¸®´Â ÀÌ mtype ¸¦ °¢°¢ ´Ù¸£°Ô ÁÜÀ¸·Î½á, ƯÁ¤ ÇÁ·Î¼¼½º¿¡¼­ ƯÁ¤ ¸Þ½ÃÁö¸¦ ÂüÁ¶ÇÒ¼ö ÀÖµµ·Ï ¸¸µé¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î A ¶ó´Â ÇÁ·Î¼¼½º°¡ A ¶ó´Â ¸Þ½Ã ŸÀÔÀ» ÂüÁ¶ÇØ¾ß Çϰí B ´Â B ·Î ÂüÁ¶Çϵµ·Ï ¸¸µé¾î¾ß ÇÑ´Ù¸é, msgbuf ¸¦ ¸¸µé¶§, mtype ¿¡ A Àº 1 B Àº 2 ÀÌ·±½ÄÀ¸·Î ¸Þ½ÃÁö ŸÀÔÀ» Á¤ÀÇ Çϰí A ´Â mtype °¡ 1ÀΰÍÀ» B´Â mtype ÀÌ 2ÀΰÍÀ» °¡Áö°í °¡µµ·Ï ¸¸µé¸é µÈ´Ù.

queue.png

À§ÀÇ ±×¸²¿¡¼­ ó·³ mtype À» ÀÌ¿ëÇØ¼­ ÀÚ½ÅÀÌ ¿øÇÏ´Â ¸Þ½ÃÁö¿¡¸¸ ¼±Åà ÀûÀ¸·Î Á¢±ÙÀÌ °¡´ÉÇÏ´Ù. ÀÌÆ¯¼ºÀ» Àß ÀÌ¿ëÇÏ¸é ¸Å¿ì À¯¿ëÇÏ°Ô »ç¿ëÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.

msgsz Àº ±¸Á¶Ã¼ÀÇ Å©±âÀÌ´Ï ±×³É ³Ñ¾î°¡°í, msgflg ¿¡ ´ëÇØ¼­ ¼³¸íÇϰڴÙ. msgflg ¿¡´Â IPC_NOWAIT¸¦ ¼³Á¤ÇÒ¼ö ÀÖÀ¸¸ç ÀÌ °ªÀ» ÀÌ¿ëÇØ¼­ ºÀ¼âÇüÀ¸·Î ÇÒ°ÍÀÎÁö ºñºÀ¼âÇüÀ¸·Î ÇÒ°ÍÀÎÁö °áÁ¤ÇÒ¼ö ÀÖ´Ù. IPC_NOWAIT¸¦ ¼³Á¤Çϸé, ¸Þ½ÃÁö°¡ ¼º°øÀûÀ¸·Î º¸³»Áö°Ô µÉ¶§±îÁö ÇØ´ç¿µ¿ª¿¡¼­ ºÀ¼â(block)µÇ¸ç, ¼³Á¤ÇÏÁö ¾ÊÀ»°æ¿ì ¿¡´Â ¹Ù·Î return ÇÏ°Ô µÈ´Ù.

2.4 ¸Þ½ÃÁöÅ¥ÀÇ µ¥ÀÌŸ °¡Á®¿À±â

µ¥ÀÌŸ´Â msgrcv(2) ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ °¡Á®¿Ã¼ö ÀÖ´Ù. 1¹øÂ° ¾Æ±Ô¸ÕÆ®´Â ¸Þ½ÃÁöÅ¥ ½Äº°ÀÚÀ̸ç, 2¹øÂ°°¡ °¡Á®¿Ã µ¥ÀÌŸ°¡ ÀúÀåµÉ ±¸Á¶Ã¼, 3¹øÂ°´Â ±¸Á¶Ã¼ÀÇ Å©±â, 4¹øÂ°´Â °¡Á®¿Ã ¸Þ½ÃÁö ŸÀÔ, 5¹øÂ°´Â ¼¼ºÎ Á¶Á¾ ¿É¼ÇÀÌ´Ù.

´Ù¸¥°ÍµéÀº ±»ÀÌ ¼³¸íÇÒ Çʿ䰡 ¾ø´Â °£´ÜÇÑ °ÍµéÀ̰í, ´Ù¸¸ 4¹øÂ° ¸Þ½ÃÁö ŸÀÔÀÎ msgtyp¿¡ ´ëÇØ¼­ »ó¼¼È÷ ¼³¸íÇϰí, msgflg ¸¦ °£´ÜÈ÷ ¼³¸íÇÏ´Â Á¤µµ·Î ³Ñ¾î°¡µµ·Ï ÇϰڴÙ. ¿ì¸®´Â ¸Þ½ÃÁö¸¦ º¸³¾ ±¸Á¶Ã¼¸¦ ¸¸µé¶§ mtype ¶ó´Â°ÍÀ» Á¤ÀÇ ÇØ¼­, ¸Þ½ÃÁö¸¦ ºÐ·ùÇØ¼­ Á¢±ÙÇÒ¼ö ÀÖµµ·Ï ÇѴٴ°ÍÀ» ¾Ë°í ÀÖ´Ù. ¸Þ½ÃÁö¸¦ °¡Á®¿Ã¶§´Â ¹Ù·Î msgtyp ¸¦ ÅëÇØ¼­ ÀڱⰡ ¿øÇÏ´Â msgtyp ÀÇ ¸Þ½ÃÁö ±¸Á¶Ã¼¿¡ Á¢±ÙÇÒ¼ö ÀÖ°Ô µÈ´Ù.
msgtyp == 0
¸Þ½ÃÁö Å¥ÀÇ Ã¹¹øÂ° µ¥ÀÌŸ¸¦ µ¹·ÁÁØ´Ù.
msgtyp > 0
¸Þ½ÃÁöÀÇ mtype °¡ msgtyp ¿Í °°Àº ù¹øÂ° µ¥ÀÌŸ¸¦ µ¹·ÁÁØ´Ù.
msgtyp < 0
¸Þ½ÃÁöÀÇ mtype ÀÌ msgtyp ÀÇ Àý´ë°ªº¸´Ù À۰ųª °°Àº ù¹øÂ° µ¥ÀÌŸ¸¦ µ¹·ÁÁØ´Ù.

msgflg ´Â msgrcv ÀÇ ¸Þ½ÃÁö °¡Á®¿À´Â ÇüŸ¦ ºÀ¼â·Î ÇÒ°ÍÀÎÁö ºñ ºÀ¼â·Î ÇÒ°ÍÀÎÁö ÁöÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. IPC_NOWAIT ¸¦ ¼³Á¤ÇÒ°æ¿ì °¡Á®¿Ã ¸Þ½ÃÁö°¡ ¾ø´õ¶óµµ ÇØ´ç ¿µ¿ª¿¡¼­ ºÀ¼âµÇÁö ¾Ê°í ¹Ù·Î error Äڵ带 ³Ñ°ÜÁÖ°í ¸®ÅÏÇÑ´Ù.


2.5 ¿¹Á¦¸¦ ÅëÇØ ¾Ë¾Æº» ¸Þ½ÃÁöÅ¥

¿©±â¿¡´Â ÃÑ 2°³ÀÇ ¿¹Á¦ÇÁ·Î±×·¥ÀÌ ¸¸µé¾îÁø´Ù. Çϳª´Â ¸Þ½ÃÁöÅ¥ »ý»êÀڷνá, ¸Þ½ÃÁöÅ¥¸¦ »ý¼ºÇÏ°í ¸Þ½ÃÁö¸¦ ¸¸µé¾î¼­ ¸Þ½ÃÁöÅ¥¿¡ º¸³»´Â(msgsnd) ÀÏÀ» ÇÏ°í ´Ù¸¥ Çϳª´Â ¼ÒºñÀÚ·Î½á ¸Þ½ÃÁöÅ¥¿¡ ÀÖ´Â µ¥ÀÌŸ¸¦ ¹Þ¾Æ¿À´Â ÀÏÀ» ÇÑ´Ù. ´ÙÀ½Àº ¸Þ½ÃÁöÅ¥ »ý»êÀÚ ÀÌ´Ù.
#include <sys/types.h>  
#include <sys/ipc.h>  
#include <sys/msg.h>  
#include <sys/stat.h>  
 
struct msgbuf 
{ 
    long msgtype; 
    char mtext[256]; 
    char myname[16]; 
    int  seq; 
}; 
 
int main() 
{ 
    key_t key_id; 
    int i; 
    struct msgbuf mybuf, rcvbuf; 
 
    key_id = msgget((key_t)1234, IPC_CREAT|0666); 
    if (key_id == -1) 
    { 
        perror("msgget error : "); 
        exit(0); 
    } 
 
    printf("Key is %d\n", key_id); 
 
    memset(mybuf.mtext, 0x00, 256);  
    memset(mybuf.myname, 0x00, 16);  
    memcpy(mybuf.mtext, "hello world 4", 13); 
    memcpy(mybuf.myname, "yundream", 8); 
    mybuf.seq = 0; 
    i = 0; 
 
    while(1) 
    { 
        // ¦¼öÀϰæ¿ì ¸Þ½ÃÁö ŸÀÔÀÌ 4 
        // Ȧ¼öÀϰæ¿ì¿¡´Â ¸Þ½ÃÁö ŸÀÔÀÌ 3 
        if (i % 2 == 0) 
            mybuf.msgtype = 4; 
        else  
            mybuf.msgtype = 3; 
        mybuf.seq = i; 
 
        // ¸Þ½ÃÁö¸¦ Àü¼ÛÇÑ´Ù.  
        if (msgsnd( key_id, (void *)&mybuf, sizeof(struct msgbuf), IPC_NOWAIT) == -1) 
        { 
            perror("msgsnd error : "); 
            exit(0); 
        }  
        printf("send %d\n", i); 
        i++; 
        sleep(1); 
    } 
 
    printf("%d \n", rcvbuf.msgtype); 
    printf("%s \n", rcvbuf.mtext); 
    printf("%s \n", rcvbuf.myname); 
    exit(0); 
} 
 
ÇÁ·Î±×·¥Àº °£´ÜÇÏ´Ù. mybuf ¶õ ±¸Á¶Ã¼¸¦ ¸¸µé¾î¼­ ¸Þ½ÃÁö¸¦ Àü¼ÛÇϴµ¥, À̶§ ¸Þ½ÃÁö ŸÀÔÀ» i % 2 °¡ 0Àϰæ¿ì 4·Î ±×·¸Áö ¾ÊÀ»°æ¿ì 3À¸·Î ÇØ¼­ Àü¼ÛÀ» Çϵµ·Ï ¸¸µé¾ú´Ù.

#include <sys/types.h>  
#include <sys/ipc.h>  
#include <sys/msg.h>  
#include <sys/stat.h>  
struct msgbuf  //±¸Á¶Ã¼µµ Çì´õÆÄÀÏ¿¡¼­ ¼±¾ðµÈ °Í°ú °ãÄ¡´Â Çö»óÀÌ ÀϾ¼­ ÄÄÆÄÀÏÀÌ µÇÁú ¾Ê½À´Ï´Ù. ±¸Á¶Ã¼ À̸§µµ ¹Ù²Ù¾î¾ßÇÕ´Ï´Ù. 
{ 
    long msgtype; 
    char mtext[256]; 
    char myname[16]; 
    int  seq; 
}; 
 
int main(int argc, char **argv) 
{ 
    key_t key_id; 
    struct msgbuf mybuf; 
    int msgtype;//Àü¿ªº¯¼ö·Î »©¾ß µË´Ï´Ù. 
 
    // ¾Æ±Ô¸ÕÆ®°¡ ÀÖÀ»°æ¿ì msgtype °¡ 3ÀÎ ¸Þ½ÃÁö¸¦ ¹Þ¾Æ¿À°í(Ȧ¼ö)  
    // ¾Æ±Ô¸ÕÆ®°¡ ¾øÀ»°æ¿ì msgtype °¡ 4ÀÎ ¸Þ½ÃÁö¸¦ ¹Þ¾Æ¿Â´Ù(¦¼ö)   
    if (argc == 2) 
        msgtype = 3; 
    else  
        msgtype = 4; 
 
    key_id = msgget(1234, IPC_CREAT|0666); 
    if (key_id < 0) 
    { 
        perror("msgget error : "); 
        exit(0); 
    } 
    while(1) 
    { 
        if (msgrcv( key_id, (void *)&mybuf, sizeof(struct msgbuf), msgtype, 0) == -1) 
        { 
            perror("msgrcv error : "); 
            exit(0);     
        } 
        printf("%d\n", mybuf.seq); 
    } 
    exit(0); 
} 
 
ÀÌ ¿¹Á¦´Â ´õ °£´ÜÇÏ´Ù. ¾Æ±Ô¸ÕÆ®°¡ ÀÖÀ¸¸é ¸Þ½ÃÁöŸÀÔÀÌ 3ÀÎ ¸Þ½ÃÁö¸¦ ¾Æ±Ô¸ÕÆ®°¡ ¾øÀ¸¸é ¸Þ½ÃÁö ŸÀÔÀÌ 4ÀÎ ¸Þ½ÃÁö¸¦ °¡Á®¿Àµµ·Ï ÇÑ´Ù.

ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÈÄ Å×½ºÆ®¸¦ ÇØº¸¸é ./msgrcv 1À» (¾Æ±Ô¸ÕÆ®¸¦ ÁÖ°í ½ÇÇà) ½ÇÇà½Ã۸é msgtype °¡ 4ÀÎ ¸Þ½ÃÁö¸¦ ¹Þ¾Æ¿À°í ±×·¸Áö ¾ÊÀ»°æ¿ì msgtype °¡ 3ÀÎ ¸Þ½ÃÁö¸¦ ¹Þ¾Æ¿ÈÀ» ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù. ./msgsnd, ./msgrcv, ./msgrcv 1 À» µ¿½Ã¿¡ ¶ç¿ö¼­ Å×½ºÆ®ÇÏ¸é µÈ´Ù.

2.6 ¸Þ½ÃÁöÅ¥ÀÇ Á¦¾î

msgctl(2)ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù. ù¹øÂ° ¾Æ±Ô¸ÕÆ®ÀÎ msqid ´Â ¸Þ½ÃÁö ½Äº°ÀÚÀ̸ç, 2¹øÂ° ¾Æ±Ô¸ÕÆ®ÀÎ cmd ´Â ÇØ´ç ÀÛµ¿¸í·É, ±×¸®°í ¸¶Áö¸· ¾Æ±Ô¸ÕÆ®´Â msqid_ds ±¸Á¶Ã¼ ÀÌ´Ù. ¿ì¸®´Â cmd ¸¦ ÅëÇØ¼­ ÇØ´ç ¸Þ½ÃÁö½Äº°ÀÚ°¡ °¡¸£Å°´Â ¸Þ½ÃÁöÅ¥¸¦ Á¦¾îÇÒ¼ö ÀÖ´Ù. cmd ¿¡´Â ¾Æ·¡¿Í °°Àº Á¾·ùÀÇ ¸í·ÉÀ» »ç¿ëÇÒ¼ö ÀÖ´Ù.

IPC_STAT
¸Þ½ÃÁöÅ¥ÀÇ Á¤º¸¸¦ ¿øÇÒ¶§ »ç¿ëÇÑ´Ù. ÇØ´ç ¸Þ½ÃÁöÅ¥ÀÇ Á¤º¸´Â 3¹øÂ° ¾Æ±Ô¸ÕÆ®ÀÎ msqid_ds ±¸Á¶Ã¼¸¦ ÅëÇØ ³Ñ¾î¿À°Ô µÈ´Ù.

IPC_SET
msqid_ds ±¸Á¶Ã¼ Á¤º¸¸¦ º¯°æÇϰíÀÚ ÇÒ¶§ »ç¿ëÇÑ´Ù. ÁÖ·Î ÆÛ¹Ì¼Ç Á¤º¸¸¦ ¹Ù²Ù±â À§Çؼ­ »ç¿ëÇÑ´Ù.
IPCRMID
ÇöÀç ¸Þ½ÃÁöÅ¥¸¦ Á¦°ÅÇÑ´Ù.

2.7 Á¤¸®

ÀÌ»ó ¸Þ½ÃÁöÅ¥¿¡ ´ëÇØ¼­ °£´ÜÈ÷ ¾Ë¾Æº¸¾Ò´Ù. Áö±Ý±îÁö ¼³¸í¿¡¼­ ó·³ ¸Þ½ÃÁöÅ¥´Â ³»ºÎ ÇÁ·Î¼¼½º°£ Åë½ÅÀ» À§ÇÑ »ó´çÈ÷ À¯¿¬ÇÑ ¹æ¹ýÀ» Á¦°øÇϰí ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù. ¹Ý¸é ´ÜÁ¡ÀÌ Àִµ¥, Á¦¾îÇϱⰡ »ó´çÈ÷ ±î´Ù·Ó´Ù´Â Á¡ÀÌ´Ù.

¿ì¼± ¸Þ½ÃÁöÅ¥¿¡ µé¾î°¥¼ö ÀÖ´Â µ¥ÀÌŸÀÇ ¼ö°¡ °íÁ¤µÇ¾î Àִµ¥, ¸Þ½ÃÁöÅ¥°¡ ¾î¶² ÀÌÀ¯·Î ²ËáÀ» °æ¿ì À̸¦ ¾Ë¼ö ÀÖ´Â ¹æ¹ýÀÌ ¾Ö¸ÅÇÏ´Ù. À§ÀÇ ¿¹Á¦¿¡¼­ ./msgrcv ¿Í ./msgrcv 1 ÀÌ ¸Þ½ÃÁö¸¦ °è¼ÓÀûÀ¸·Î ¼ÒºñÇϵµ·Ï µÇ¾î Àִµ¥, ¸¸¾à µÑÁß Çϳª°¡ ÀÌ»óÀÛµ¿À» ÇØ¼­ ¸Þ½ÃÁö¸¦ ¹Þ¾Æ¿ÀÁö ¸øÇÒ°æ¿ì °á±¹ ¸Þ½ÃÁöÅ¥°¡ ²Ë Â÷¹ö¸®°Ô µÇ°í, ´õÀÌ»ó Á¤»óÀûÀÎ ÀÛµ¿À» ¸øÇÏ°Ô µÉ°ÍÀÌ´Ù. ¶ÇÇÑ Ä¿³ÎÀÇ ¿µÇâÀ» ¸¹ÀÌ ¹ÞÀ¸¸ç, À߸øµÈ ¸Þ½ÃÁöÅ¥ÀÇ »ç¿ëÀº Àüü ½Ã½ºÅÛ¿¡ ¿µÇâÀ» ¹ÌÄ¥¼öµµ ÀÖ°Ô ¸¸µç´Ù. ÀÌ´Â Àüü ½Ã½ºÅÛ¿¡¼­ »ç¿ëÇÒ¼ö ÀÖ´Â ¸Þ½ÃÁöÅ¥ÀÇ ¼ö¿Í Å©±â¿¡ Á¦ÇÑÀÌ Àֱ⠶§¹®À¸·Î, ¸Þ½ÃÁöÅ¥¸¦ »ç¿ëÇϱâ À§Çؼ­´Â Á¶½ÉÇØ¼­ »ç¿ëÇØ¾ßµÉ Çʿ伺ÀÌ ÀÖ´Ù.

¶ÇÇÑ Ä¿³ÎÀº ¸î°³ÀÇ ÇÁ·Î¼¼½º°¡ ÇöÀç ¸Þ½ÃÁöÅ¥¸¦ ÂüÁ¶ÇÏ´ÂÁö¸¦ ¾Ë·ÁÁÖ´Â ÂüÁ¶°è¼ö¸¦ Á¦°øÇÏÁö ¾Ê´Â´Ù. ±×·¯¹Ç·Î ÇÁ·Î¼¼½º¿¡ ¾î¶² ¹®Á¦°¡ »ý°åÀ»¶§, ÇØ´ç ÇÁ·Î¼¼½º¿¡ Á¤È®ÇÏ°Ô ¾î¶² ¹®Á¦°¡ ¹ß»ýÇß´ÂÁö ¾Ë¾Æ³»´Â°Ô »ó´çÈ÷ ±î´Ù·Ó´Ù.

±×·¯¹Ç·Î ¸Þ½ÃÁöÅ¥¸¦ ªÀº ½Ã°£¿¡ ´Ù·®ÀÇ Á¤º¸¸¦ Àü´ÞÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÏ´Â µ¥¿¡´Â Àû´çÄ¡ ¾Ê´Ù. ±×¸® ¸¹Áö ¾ÊÀº Á¤º¸¸¦ ÇÁ·Î¼¼½º°£ ±³È¯Çϱâ À§ÇÑ ¿ëµµ·Î »ç¿ëÇϱ⿡ Àû´çÇÑ IPC ¼³ºñÀÌ´Ù.

3 POSIX ¸Þ½ÃÁö Å¥

POSIX ¸Þ½ÃÁö Å¥´Â System V ¸Þ½ÃÁö Å¥ÀÇ »õ·Î¿î ¹öÀüÀÌ´Ù. ÇÔ¼öÀÇ À̸§°ú Á¾·ù´Â ´Ù¸£Áö¸¸ ÇÏ´ÂÀÏÀº ºñ½ÁÇÏ´Ù.

3.1 ¸Þ¼¼Áö Å¥ ÆÄÀÏ ½Ã½ºÅÛ ¸¸µé±â

¸®´ª½º¿¡¼­ ¸Þ¼¼Áö Å¥´Â °¡»ó ÆÄÀÏ ½Ã½ºÅÛ¿¡ ¸¸µé¾î Áø´Ù. ´ÙÀ½°ú °°ÀÌ ¸¸µé¸é µÈ´Ù.
$ mkdir /dev/mqueue 
$ mount -t mqueue none /dev/mqueue 
 
»ý¼ºµÈ µð·ºÅ丮´Â ÀÚµ¿À¸·Î sticky bit°¡ ¼³Á¤µÈ´Ù.

ÀÌÁ¦ mq_openÇÔ¼ö·Î ¸Þ¼¼Áö Å¥¸¦ »ý¼º ¿äûÀ» Çϸé /dev/mqueue¾Æ·¡¿¡ ÆÄÀÏ ÇüÅ·Π¸¸µé¾îÁø´Ù. ÀÏ¹Ý ÆÄÀÏÀ̹ǷΠls(1), rm(1)µîÀ¸·Î °ü¸®ÇÒ ¼ö ÀÖ´Ù.

catÀ¸·Î ¸Þ¼¼ÁöÅ¥ÀÇ ³»¿ëÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
#!plan
$ cat /dev/mqueue/q.123
QSIZE:0          NOTIFY:0     SIGNO:0     NOTIFY_PID:0     
°¢ Çʵ忡 ´ëÇØ¼­ »ìÆìº¸ÀÚ.
  • QSIZE : Å¥¿¡ ÀÖ´Â ¸ðµç ¸Þ½ÃÁöÀÇ ¹ÙÀÌÆ® Å©±â
  • NOTIFY_PID :
  • NOTIFY :
  • SIGNO :