|
ÃÑ ÆäÀÌÁö ¼ö : 3027
![]()
|
ÇöÀçÀ§Ä¡ : ¹Ì´Ï»çÀÌÆ®>½Ã½ºÅÛÇÁ·Î±×·¡¹Ö>IPC>MessageQueue 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
msgget ´Â ¼º°øÇÒ°æ¿ì ¸Þ½ÃÁöÅ¥¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Â int ÇüÀÇ ¸Þ½ÃÁöÅ¥ ½Äº°ÀÚ¸¦ µÇµ¹·ÁÁÖ¸ç, ÀÌÈķδ ÀÌ ¸Þ½ÃÁöÅ¥ ½Äº°ÀÚ¸¦ ÅëÇØ¼ ÇÊ¿äÇÑ ÀÛ¾÷À» ÇÏ°Ô µÈ´Ù. ¸Þ½ÃÁöÅ¥¸¦ »õ·Î »ý¼ºÇϱâ À§Çؼ »ç¿ëÇÑ´Ù. ¸¸¾à ±âÁ¸¿¡ key ·Î »ý¼±µÈ ¸Þ½ÃÁöÅ¥°¡ ÀÖ´Ù¸é ÇØ´ç ¸Þ½ÃÁöÅ¥ÀÇ ½Äº°ÀÚ¸¦ µÇµ¹·ÁÁØ´Ù. IPC_EXCL IPC_CREAT ¿Í ÇÔ²² ¾²À̸ç, IPC_EXCLÀÌ ÁöÁ¤µÇ¾î ÀÖÀ»°æ¿ì ÀÌ¹Ì key ·Î Á¸ÀçÇÏ´Â ¸Þ½ÃÁöÅ¥°¡ ÀÖ´Ù¸é, -1 À» ¸®ÅÏÇϰí errno ¸¦ ¼¼ÆÃÇÑ´Ù. 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ÀΰÍÀ» °¡Áö°í °¡µµ·Ï ¸¸µé¸é µÈ´Ù. ![]()
À§ÀÇ ±×¸²¿¡¼ ó·³ 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
msgflg ´Â msgrcv ÀÇ ¸Þ½ÃÁö °¡Á®¿À´Â ÇüŸ¦ ºÀ¼â·Î ÇÒ°ÍÀÎÁö ºñ ºÀ¼â·Î ÇÒ°ÍÀÎÁö ÁöÁ¤Çϱâ À§Çؼ »ç¿ëÇÑ´Ù. IPC_NOWAIT ¸¦ ¼³Á¤ÇÒ°æ¿ì °¡Á®¿Ã ¸Þ½ÃÁö°¡ ¾ø´õ¶óµµ ÇØ´ç ¿µ¿ª¿¡¼ ºÀ¼âµÇÁö ¾Ê°í ¹Ù·Î error Äڵ带 ³Ñ°ÜÁÖ°í ¸®ÅÏÇÑ´Ù.
¸Þ½ÃÁö Å¥ÀÇ Ã¹¹øÂ° µ¥ÀÌŸ¸¦ µ¹·ÁÁØ´Ù.
msgtyp > 0
¸Þ½ÃÁöÀÇ mtype °¡ msgtyp ¿Í °°Àº ù¹øÂ° µ¥ÀÌŸ¸¦ µ¹·ÁÁØ´Ù.
msgtyp < 0¸Þ½ÃÁöÀÇ mtype ÀÌ msgtyp ÀÇ Àý´ë°ªº¸´Ù À۰ųª °°Àº ù¹øÂ° µ¥ÀÌŸ¸¦ µ¹·ÁÁØ´Ù. 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°¢ Çʵ忡 ´ëÇØ¼ »ìÆìº¸ÀÚ.
|
|