Subject : IPC °³³äÀº ? Description : < ÇÁ·Î¼¼½º°£ Åë½Å > o °³ ¿ä - Àü»ê¸Á ÇÁ·Î±×·¥Àº µÑ ¶Ç´Â ±× ÀÌ»óÀÇ ÇÁ·Î¼¼½ºµé »çÀÌ¿¡¼ ÀϾ´Â »óÈ£ ÀÛ¿ëÀ» Æ÷ÇÔÇϹǷÎ, Åë½ÅÀ» ÇÏ°íÀÚ ÇÏ´Â ¼·Î ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ »ç¿ë°¡´ÉÇÑ ¿©·¯ °¡Áö ¹æ¹ýµé¿¡ ´ëÇÏ¿© Á¶½É½º·´°Ô »ìÆì º¸¾Æ¾ß ÇÑ´Ù. ±âÁ¸ÀÇ ´ÜÀÏ ÇÁ·Î¼¼½º ÇÁ·Î±×·¥¿¡¼´Â ÇÑ ÇÁ·Î¼¼½º ³»¿¡ ¿©·¯ ´ÜÆíµéÀÌ Àü¿ª º¯¼ö³ª ÇÔ¼ö È£Ãâ, ±×¸®°í ÀÌ ÇÔ¼ö¿Í ±× È£ÃâÀÚ »çÀÌ¿¡¼ ÁÖ°í ¹Þ´Â µ¶¸³ º¯¼ö¿Í ÇÔ¼öÀÇ °á°ú¸¦ ÀÌ¿ëÇÏ¿© ¼·Î Åë½ÅÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª °¢ ÇÁ·Î¼¼½º°¡ °íÀ¯ÇÑ ÀÚ½ÅÀÇ ÁÖ¼Ò ¿µ¿ª³»¿¡¼ ½ÇÇàµÇ´Â , ¼·Î µ¶¸³µÇ¾î ÀÖ´Â ÇÁ·Î¼¼½ºµéÀ» ´Ù·ç°íÀÚ ÇÒ ¶§¿¡´Â Á»´Ù ÀÚ¼¼È÷ °í·ÁÇØ¾ß ÇÒ °ÍµéÀÌ´Ù. ¾à 20¿©³âÀü, ½ÃºÐÇÒ-´ÙÁß ÇÁ·Î±×·¥ ¿î¿µ üÁ¦°¡ °³¹ßµÇ¾úÀ» ¶§ ±× ¼³°è ¸ñÀû ÁßÀÇ Çϳª´Â µ¶¸³µÈ ÇÁ·Î¼¼½ºµéÀÌ ¼·Î °£¼·ÇÏÁö ¾ÊÀ½À» º¸ÀåÇØ ÁÖ´Â °ÍÀ̾ú´Ù. µÎ ÇÁ·Î¼¼½º°¡ ¼·Î Åë½ÅÇϱâ À§Çؼ´Â, ¾çÀÚ°¡ ¸ðµÎ ÀÌ Åë½Å¿¡ µ¿ÀÇÇØ¾ß ÇÏ°í, ¶Ç ¿î¿µ üÁ¦°¡ ÇÁ·Î¼¼½º°£ Åë½Å(Interprocess Communication,IPC)À» À§ÇÑ ÆíÀǸ¦ Á¦°øÇØ¾ß ÇÑ´Ù. page 85 ±×¸² ÂüÁ¶ ¿©±â¼ IPCÀÇ ¿©·¯ °¡Áö ¹æ¹ýµéÀ» »ìÆ캸±â·Î ÇÑ´Ù. . ÆÄÀÌÇÁ(pipes) . FIFOs(Áö¸í ÆÄÀÌÇÁ:named pipes) . ¼Ò½Ä´ë·Õ(message queues) . Â÷´Ü Ç¥½Ã±â(semaphores) . °øÀ¯±â¾ïÀå¼Ò(shared memory) o Àá±Ý°ú ·¹ÄÚµå ÈÀÏ - ´Ù¼öÀÇ ÇÁ·Î¼¼½º°¡ ƯÁ¤ ÀÚ¿øÀ» °øÀ¯ÇÏ°íÀÚ ÇÒ °æ¿ì°¡ ÀÖ´Ù. À̶§ ¾î´À ÇѼø°£¿¡´Â ÇÑ ÇÁ·Î¼¼½º¸¸ÀÌ ±× ÀÚ¿øÀ» »ç¿ëÇÒ ¼ö ÀÖµµ·Ï, ±× ÀÚ¿ø »ç¿ë¿¡ ÀÖ¾î ¾î¶² ÇüÅÂÀÇ »óÈ£ ¹èÁ¦°¡ ÇʼöÀûÀ¸·Î Á¦°øµÇ¾î¾ß ÇÑ´Ù. ´ÙÀ½°ú °°Àº ÇÁ·Î±×·¥À» »ý°¢Çغ¸ÀÚ . ÀϷùøÈ£ ÈÀÏÀ» Àд´Ù. . ±× ¹øÈ£¸¦ »ç¿ëÇÑ´Ù. . ¼ýÀÚ¸¦ Áõ°¡½ÃÅ°°í ±×°ÍÀ» ´Ù½Ã ±â·ÏÇÑ´Ù. ÇÑ ÇÁ·Î¼¼½º°¡ ÀÌ ¼¼´Ü°è¸¦ ½ÇÇàÇÏ°í ÀÖ´Â µ¿¾È ÀϾ ¼ö ÀÖ´Â ¹®Á¦Á¡Àº ¶Ç ´Ù¸¥ ÇÁ·Î¼¼½º°¡ °°Àº ¼¼ ´Ü°è¸¦ ¼öÇàÇÒ ¼öµµ ÀÖ´Ù´Â °ÍÀÌ´Ù. °á±¹ È¥¶õÀÌ µÇ´Âµ¥ , µû¶ó¼ ÇÑ ÇÁ·Î¼¼½º°¡ ÀÏÀ» ¸ðµÎ ³¡³¾ ¶§±îÁö ´Ù¸¥ ¾î¶² ÇÁ·Î¼¼½ºµµ ±× ÈÀÏ¿¡ Á¢±ÙÇÒ ¼ö ¾øµµ·Ï Àá±ÝÀ» ¼³Á¤ÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù. ´ÙÀ½Àº À§ÀÇ ¼¼ ´Ü°è¸¦ ¼öÇàÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. ÇÔ¼ö my_lock my_unlockÀº ½ÃÀÛÇÒ ¶§ ÈÀÏÀ» Àá±×°í ÀÏ·Ã ¹øÈ£¿Í °ü°èµÈ ÀÛ¾÷ÀÌ ³¡³ª¸é ÈÀÏÀÇ Àá±ÝÀ» Ç®±âÀ§ÇØ È£ÃâÇÑ´Ù. #include#define SEQFILE "ljs" #define MAXBUFF 100 main() { int fd,i,n,pid,seqno; char buff[MAXBUFF+1]; pid=getpid(); if ( (fd =open(SEQFILE,2))<0) printf("can't open %s\n",SEQFILE); for (i=0;i<20;i++) { my_lock(fd); lseek(fd,0L,0); /* rewind before read */ if ( (n=read(fd,buff,MAXBUFF)) <=0) printf("read error\n"); buff[n]='\0'; if ( (n=sscanf(buff,"%d\n",&seqno)) != 1) printf("sscanf error"); printf("pid=%d, seq#=%d\n",pid,seqno); seqno++; sprintf(buff,"%03d\n",seqno); n=strlen(buff); lseek(fd,0L,0); if (write(fd,buff,n)!=n) printf("write error"); my_unlock(fd); } } my_lock(fd) int fd; { return; } my_unlock(fd) int fd; { return; } À§ÀÇ my_lock¿Í my_unlockÀº ÀüÇô Àá±ÝÀ» Á¦°øÇÏÁö ¾Ê´Â´Ù. o ÈÀÏ Àá±Ý°ú ·¹ÄÚµå Àá±Ý - ÈÀÏ Àá±ÝÀº ÈÀÏ Àüü¸¦ Àá±×´Âµ¥ ºñÇÏ¿© ·¹ÄÚµå Àá±ÝÀº ÇÁ·Î¼¼½º·Î ÇÏ¿©±Ý ÇÑ ÈÀÏÀÇ Æ¯Á¤ ºÎºÐÀ» Àá±Û ¼ö ÀÖµµ·Ï ÇÑ´Ù. À¯´Ð½º ·¹ÄÚµå Àá±Ý¿¡¼ »ç¿ëÇÏ´Â ·¹ÄÚµå´Â ÈÀϳ»¿¡¼ ½ÃÀÛ ¹ÙÀÌÆ® À§Ä¡¿Í ±× ÁöÁ¡À¸·ÎºÎÅÍÀÇ ¹ÙÀÌÆ® ¼ö¸¦ ÁöÁ¤ÇÔÀ¸·Î½á Á¤ÀÇÇÑ´Ù. ·¹ÄÚµå Àá±ÝÀ̶ó´Â ¿ë¾î´Â ´Ù¸¥ ¿î¿µ üÁ¦¿¡¼ µð½ºÅ© ÈÀÏÀ» ·¹ÄÚµå ÀÚ·á ±¸Á¶·Î ±¸¼ºÇϴµ¥¿¡¼ À¯·¡µÇ¾ú´Ù. À¯´Ð½º ¾Ë¸ÍÀÌ°¡ ·¹ÄÚµåÀÇ °³³äÀ» Á¦°øÇÏÁö ¾ÊÀ¸¹Ç·Î À¯´Ð½ºÀÇ Æ¯Â¡À» °í·ÁÇÑ´Ù¸é ¿µ¿ª Àá±Ý(range locking) À̶ó´Â ¿ë¾î°¡ ´õ ÁÁÀ» °ÍÀÌ´Ù. Áï Àá±ÝÀÇ ´ë»óÀÌ ÈÀÏÀÇ ¿µ¿ªÀÌ µÇ´Â °ÍÀÌ´Ù. ÀÌ ¿µ¿ªÀÌ ·¹ÄÚµå¿Í ¾î¶² À¯»ç¼ºÀ» °®´ÂÁö ¿©ºÎ´Â ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ´Þ·Á ÀÖ´Ù. System V¿¡¼ lockf ÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù. #include int lockf(int fd, int function, long size); ¿©±â¼ functionÀº ´ÙÀ½ °ªÁßÀÇ Çϳª¸¦ °®´Â´Ù. F_ULOCK Àü¿¡ Àá±Ù ¿µ¿ªÀ» Àá±Ý ÇØÁ¦ÇÑ´Ù. F_LOCK ÇÑ ¿µ¿ªÀ» Àá±Ù´Ù(ºÀ¼â) F_TLOCK ÇÑ ¿µ¿ªÀ» °Ë»çÇÏ°í Àá±Ù´Ù(ºñºÀ¼â) F_TEST ÇÑ ¿µ¿ªÀÇ Àá±Ý ¿©ºÎ¸¦ °Ë»çÇÑ´Ù.. lockf ÇÔ¼ö´Â ÇöÀç ÈÀÏÀÇ À§Ä¡¿Í "·¹ÄÚµå"¸¦ Á¤ÀÇÇϱâ À§ÇÑ sizeµ¶¸³ º¯¼ö¸¦ »ç¿ëÇÑ´Ù. ·¹ÄÚµå´Â ÇöÀçÀÇ À§Ä¡¿¡¼ ½ÃÀÛÇÏ¿© ¾ç¼öÀÇ size¸¸Å ¾ÕÂÊÀ¸·Î È®ÀåµÇ°Å³ª À½¼öÀÇ size ¸¸Å µÞÂÊÀ¸·Î È®ÀåµÈ´Ù. size°¡ 0ÀÎ °æ¿ì ¿µÇâÀ» ¹Þ´Â ·¹ÄÚµå´Â ÇöÀçÀÇ À§Ä¡·ÎºÎÅÍ °¡Àå Å« ÈÀÏ À§Ä¡(ÈÀÏÀÇ ³¡)±îÁö È®ÀåµÈ´Ù. ÈÀÏÀÇ ½ÃÀÛÁ¡À¸·Î lseekÀ» ÇàÇÑÈÄ size0ÀÇ lockf¸¦ ¼öÇàÇϸé Àüü ÈÀÏÀÌ Àá±ä´Ù. lockf ÇÔ¼ö´Â Àá±ÝÀ» ¼³Á¤ÇÏ´Â ±â´É°ú Àá±Ý ¼³Á¤ ¿©ºÎ¸¦ °Ë»çÇÏ´Â ±â´É µÎ°¡Áö¸¦ ¸ðµÎ Á¦°øÇÑ´Ù. function°ªÀÌ F_LOCKÀÌ°í ±× ¿µ¿ªÀÌ ÀÌ¹Ì ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ÀÇÇØ Àá°ÜÁ® ÀÖÀ¸¸é , È£Ãâ ÇÁ·Î¼¼½º´Â ±× ¿µ¿ªÀÌ »ç¿ë °¡´ÉÇØÁú ¶§±îÁö ´ë±â »óÅ°¡ µÈ´Ù. À̸¦ ºÀ¼â¶ó ÇÑ´Ù. ±×·¯³ª F_TLOCK¿¬»êÀº ºñºÀ¼â¶ó ĪÇϴµ¥ - ¸¸¾à ±× ¿µ¿ªÀÌ »ç¿ë°¡´ÉÇÏÁö ¾ÊÀº °æ¿ì, lockfÇÔ¼ö´Â Áï½Ã -1ÀÇ °ªÀ¸·Î º¹±ÍÇÏ°í errnoÀ» EAGAIN ¶Ç´Â EACCES·Î ¸¸µç´Ù. ¶ÇÇÑ F_TEST¿¬»êÀº ÇÁ·Î¼¼½º·Î ÇÏ¿©±Ý Àá±Ý¼³Á¤ ¾øÀÌ Àá±Ý ¿©ºÎ¸¸À» °Ë»çÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. ºñºÀ¼â Àá±ÝÀ» Çϱâ À§Çؼ´Â F_TLOCK¿¬»êÀ» »ç¿ëÇؾ߸¸ ÇÑ´Ù. ´ÙÀ½°ú °°Àº °æ¿ì¸¦ »ý°¢ÇØ º¸ÀÚ. if (lockf(fd, F_TEST, size) ==0) { rc = lockf(fd, F_LOCK, size); ... } À§ÀÇ°æ¿ì, F_TEST¿Í F_LOCK»çÀÌ¿¡¼ ´Ù¸¥ ÇÁ·Î¼¼½º°¡ lockf ÇÔ¼ö¸¦ È£ÃâÇϸé F_LOCKÀ» ºÀ¼âÇÏ´Â °æ¿ì°¡ »ý±æ ¼ö ÀÖ´Ù. F_TLOCKÀº ÀÌ °æ¿ì¿¡ ÇÊ¿äÇÑ ´ÜÀÏ ÀÛ¾÷ ¹æ½ÄÀ¸·Î Àá±ÝÀ» ½ÃÇèÇÏ°í ¼³Á¤ÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. ºñºÀ¼â Àá±ÝÀÇ ÇÑ ¿¹·Î, ¸¸¾à ¾î´À Æļö²Û ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÏ°í ¼öÇàÁßÀÎ Æļö²ÛÀÌ ¿ÀÁ÷ ÇϳªÀ̱⸦ ¿øÇÏ´Â °æ¿ì¸¦ »ý°¢ÇØ º¸ÀÚ. Æļö²Û ÇÁ·Î±×·¥ÀÌ ½ÃÀ۵Ǹé, ƯÁ¤ ÈÀÏ¿¡ ºñºÀ¼â Àá±ÝÀ» ½ÇÇàÇÑ´Ù. Àá±ÝÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é, Æļö²Û ÇÁ·Î±×·¥Àº ¿ÀÁ÷ Çϳª¸¸ÀÌ ¼öÇàÁßÀÏ °ÍÀÌ°í, ½ÇÆÐÇÑ´Ù¸é ÀÌ¹Ì ±×ÀÇ º¹Á¦°¡ Çϳª ´õ Á¸ÀçÇÑ´Ù´Â °ÍÀ¸·Î ÀνÄÇÏ°í, ÀÚ½ÅÀº Á¾·áÇÒ ¼ö ÀÖ´Ù. o BSD ±Ç°í Àá±Ý - 4.3BSD°¡ Á¦°øÇÏ´Â ±Ç°í ÈÀÏ Àá±ÝÀ» ÀÌ¿ëÇÏ´Â ¾ÕÀÇ ÀÏ·Ã ¹øÈ£ÀÇ ¿¹¸¦ °è¼Ó ¼³¸íÇÑ´Ù. flock½Ã½ºÅÛ È£ÃâÀº ÇÑ ÈÀÏÀÇ Àá±Ý°ú Àá±Ý ÇØÁ¦¸¦ Á¦°øÇÑ´Ù. #include int flock(int fd, int operation); fd´Â ¿·Á ÀÖ´Â ÈÀÏÀÇ ÈÀÏ ÁöÁ¤ ¹øÈ£ÀÌ°í, operationÀº ´ÙÀ½ »ó¼öµé·ÎºÎÅÍ Çü¼ºµÈ´Ù. LOCK_SH °øÀ¯ Àá±Ý LOCK_EX »óÈ£ ¹èÁ¦ Àá±Ý LOCK_UN Àá±Ý ÇØÁ¦ LOCK_NB Àá±Ý¿¡¼ ºÀ¼âÇÏÁö ¾ÊÀ½ Çϳª ÀÌ»óÀÇ °øÀ¯ Àá±ÝÀº ÇÑ ÈÀÏ¿¡ ´ëÇÏ¿© Ç×»ó Àû¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ÇϳªÀÇ ÈÀÏ¿¡ ´ëÇØ °øÀ¯Àá±Ý°ú »óÈ£ ¹èÁ¦ Àá±ÝÀ» µ¿½Ã¿¡ Á¦°øÇϰųª ´Ù¼öÀÇ »óÈ£ ¹èÁ¦ Àá±ÝÀ» Á¦°øÇÏ´Â °ÍÀº ¾î¶² °æ¿ì¿¡µµ ºÒ°¡´ÉÇÏ´Ù. Çã¿ëµÇ´Â Àá±Ý ¿¬»êÀº ¾Æ·¡¿Í °°´Ù. LOCK_SH °øÀ¯ Àá±Ý(ºÀ¼â) LOCK_EX »óÈ£ ¹èÁ¦ Àá±Ý(ºÀ¼â) LOCK_SH | LOCK_NB °øÀ¯ Àá±Ý(ºñºÀ¼â) LOCK_EX | LOCK_NB »óÈ£ ¹èÁ¦ Àá±Ý(ºñºÀ¼â) LOCK_UN Àá±Ý ÇØÁ¦ Àá±ÝÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é flockÀÌ 0À» µ¹·ÁÁÖ°í, ±×·¸Áö ¾ÊÀ¸¸é -1À» µ¹·ÁÁØ´Ù. ¸¸¾à ÈÀÏÀÌ ÀÌ¹Ì Àá±â¾î ÀÖ°í, ºñºÀ¼â Àá±ÝÀÌ ¿ä±¸µÇ¾î(LOCK_NB), Àá±Ý¿¡ ½ÇÆÐÇÑ´Ù¸é , Àü¿ª º¯¼ö errno´Â EWOULDBLOCKÀÌ µÈ´Ù. ¿ì¸®°¡ ´ÙÀ½°ú °°ÀÌ Àá±Ý ÇÔ¼ö¸¦ ¸¸µé¾î¾ß ÇÔÀ» ÀǹÌÇÑ´Ù. /* Locking routines for 4.3BSD */ #include my_lock(fd) int fd; { if(flock(fd,LOCK_EX) == -1) printf("Can't LOCK_EX); } my_unlock(fd) int fd; { if(flock(fd,LOCK_UN) == -1) printf("Can't LOCK_UN); } o ´Ü¼øÇÑ °í°´-ÀϲÛÀÇ ¿¹ - ¾Æ·¡±×¸²ÀÇ °í°´-ÀϲÛÀÇ ¿¹´Â IPCÀÇ ´Ù¾çÇÑ ¹æ¹ýµéÀ» ¼³¸íÇϱâ À§ÇÏ¿© ÀÌ Àå Àüü¿¡¼ »ç¿ëÇÑ´Ù. °í°´Àº Ç¥ÁØÀÔ·ÂÀ¸·ÎºÎÅÍ ÈÀÏ À̸§À» ÀÐ°í ±×°ÍÀ» IPC ä³Î¿¡ ¾´´Ù. ÀϲÛÀº ÀÌ ÈÀÏÀ̸§À» IPC ä³Î·ÎºÎÅÍ Àаí, ÀÌ ÈÀÏÀ» Àбâ À§ÇØ ÈÀÏÀ» ¿·Á°í ÇÑ´Ù. ÀϲÛÀÌ ÈÀÏÀ» ¿°ÔµÇ¸é ±× ÈÀÏÀ» ÀÐ¾î¼ ±× ³»¿ëÀ» IPC ä³Î¿¡ ¾¸À¸·Î½á ÀÀ´äÇÏ°Ô µÇ°í, ±×·¸Áö ¸øÇϸé ÈÀÏÀ» ¿¼ö ¾ø´Ù´Â ASCII·Î µÈ ¿¡·¯ ¼Ò½ÄÀ¸·Î ÀÀ´äÇÏ°Ô µÈ´Ù. ±×·¯¸é , °í°´Àº IPCä³Î·ÎºÎÅÍ Àаí, ÀÚ½ÅÀÌ ÀÐÀº °ÍÀ» Ç¥ÁØ Ãâ·Â¿¡ ¾´´Ù. ÀϲÛÀÌ ÈÀÏÀ» ÀÐÁö ¸øÇϸé, °í°´Àº IPCä³Î·ÎºÎÅÍ ¿¡·¯ ¼Ò½ÄÀ» Àд´Ù. ±×·¸Áö ¾ÊÀº °æ¿ì ±× ÈÀÏÀÇ ³»¿ëÀ» Àд´Ù. filename stdin ----------- filename ------------- ------> | | ----------------> | | <--- file | client | file contents | server | file contents <----- | | <--------------- | | or error ¸Þ½ÃÁö stdout ----------- or error messages ------------- o ÆÄÀÌÇÁ - À¯´Ð½º´Â ¿©·¯ Èï¹ÌÀÖ´Â °Íµé°ú ÇÔ²² ÆÄÀÌÇÁ¸¦ Á¦°øÇÑ´Ù. ÇϳªÀÇ ÆÄÀÌÇÁ´Â µ¥ÀÌŸÀÇ ÀϹæ È帧À» Á¦°øÇÏ¸ç ½Ã½ºÅÛ È£Ãâ pipe¸¦ ÀÌ¿ëÇÏ¿© ¸¸µç´Ù. int pipe(int *filedes); µÎ°³ÀÇ ÈÀÏ ÁöÁ¤ ¹øÈ£ -Àб⸦ À§ÇØ ¿¸®´Â filedes[0]¿Í ¾²±â¸¦ À§ÇÑ filedes[1]- ¸¦ µ¹·ÁÁØ´Ù. ÆÄÀÌÇÁ´Â ÇϳªÀÇ ÇÁ·Î¼¼½º³»¿¡¼´Â Àß »ç¿ëÇÏÁö ¾ÊÁö¸¸, ¿©±â¼´Â ÀÌ ÆÄÀÌÇÁµéÀÌ ¾î¶»°Ô ¸¸µé¾îÁö°í »ç¿ëµÇ´ÂÁö¸¦ ¼³¸íÇϱâ À§ÇØ °£´ÜÇÑ ¿¹¸¦ µç´Ù. main() { int pipefd[2],n; char buff[100]; if (pipe(pipefd) <0) printf("pipe error"); printf("read fd= %d, write fd= %d\n", pipefd[0],pipefd[1]); if (write(pipefd[1], "hello world\n",12) != 12) printf("write error"); if ( (n=read(pipefd[0], buff, sizeof(buff))) <= 0) ==> pipefd[0]¿¡¼ sizeof(buff)¸¸Å ÀÐ¾î¼ printf("read error"); buff¿¡ ÀúÀå write(1,buff,n); /* fd 1 = stdou */ exit(0); } ´ÜÀÏ ÇÁ·Î¼¼½º ³»¿¡¼ ÆÄÀÌÇÁ°¡ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö´Â page 99 ±×¸² 3.4¿¡ ÀÖ´Ù. ÇϳªÀÇ ÆÄÀÌÇÁ´Â Ç×»ó Àû¾îµµ 4096 ¹ÙÀÌÆ®ÀÇ ÇÑÁ¤µÈ Å©±â¸¦ °®´Â´Ù. ÆÄÀÌÇÁ¸¦ ÀÐ°í ¾²±â À§ÇÑ ±ÔÄ¢ - ÆÄÀÌÇÁ ³»¿¡ ´õÀÌ»óÀÇ µ¥ÀÌŸ°¡ ¾øÀ» ¶§ ȤÀº ÆÄÀÌÇÁ°¡ °¡µæ ãÀ» ¶§ -Àº FIFO¿¡ °üÇÑ ´ÙÀ½ Àý¿¡¼ ¼³¸íÇÒ °ÍÀÌ´Ù. ¼·Î ´Ù¸¥ µÎ ÇÁ·Î¼¼½º »çÀÌ¿¡¼ Åë½ÅÇϱâ À§ÇØ ÆÄÀÌÇÁ¸¦ »ç¿ëÇÏ´Â ÀüÇüÀûÀÎ ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù. ¿ì¼± ÇÑ ÇÁ·Î¼¼½º°¡ ÆÄÀÌÇÁ¸¦ ¸¸µé°í ±×¸®°í³ª¼ fork¸¦ ÀÌ¿ë, ÀÚ±âÀÚ½ÅÀ» º¹Á¦ÇÑ´Ù. ±×¸®°í ³ª¼ ¾î¹öÀÌ ÇÁ·Î¼¼½º°¡ ÆÄÀÌÇÁ ÀбâÂÊÀ» ´Ý°í, ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¾²±âÂÊÀ» ´Ý´Â´Ù. ÀÌ·¸°Ô ÇÏ¿© µÎ ÇÁ·Î¼¼½º »çÀÌ¿¡¼ µ¥ÀÌŸÀÇ ÀϹæ È帧ÀÌ ¸¸µé¾îÁø´Ù. - À¯´Ð½º ²®µ¥±â¿¡ »ç¿ëÀÚ°¡ who | sort | lpr ÀÇ ¸í·É¾î¸¦ ÀÔ·ÂÇÏ¸é ²®µ¥±â´Â ¼¼°³ÀÇ ÇÁ·Î¼¼½º¿Í ±×µé »çÀÌ¿¡ µÎ°³ÀÇ ÆÄÀÌÇÁ¸¦ ¸¸µé±â À§Çؼ À§¿¡¼ ¾ð±ÞÇÑ °ÍÀ» ´Ü°èÀûÀ¸·Î ÇàÇÑ´Ù. Áö±Ý±îÁö º¸¾Ò´ø ¸ðµç ÆÄÀÌÇÁ´Â ´ÜÀÏ ¹æÇâÀ» °¡Áö¸ç, ¿ÀÁ÷ ÇÑ ¹æÇâÀÇ µ¥ÀÌŸ È帧À» Á¦°øÇÏ´Â °ÍÀ̾ú´Ù. ¾ç¹æÇâÀÇ µ¥ÀÌŸ È帧ÀÌ ÇÊ¿äÇÑ °æ¿ì, µÎ°³ÀÇ ÆÄÀÌÇÁ¸¦ ¸¸µé¾î¼ °¢ ¹æÇâÀÇ Àü¼ÛÀ» À§ÇØ °¢°¢ Çϳª¾¿ »ç¿ëÇÑ´Ù. ½ÇÁ¦·Î À̸¦ ±¸ÇöÇϱâ À§ÇÑ ´Ü°è´Â ´ÙÀ½°ú °°´Ù. . ÆÄÀÌÇÁ 1À» ¸¸µé°í, ÆÄÀÌÇÁ 2¸¦ ¸¸µç´Ù. . fork¸¦ ÇÑ´Ù. . ¾î¹öÀÌ´Â ÆÄÀÌÇÁ1ÀÇ ÀбâÂÊÀ» ´Ý´Â´Ù. . ¾î¹öÀÌ´Â ÆÄÀÌÇÁ2ÀÇ ¾²±âÂÊÀ» ´Ý´Â´Ù. . ÀÚ½ÄÀº ÆÄÀÌÇÁ 1ÀÇ ¾²±âÂÊÀ» ´Ý´Â´Ù. . ÀÚ½ÄÀº ÆÄÀÌÇÁ 2ÀÇ ÀбâÂÊÀ» ´Ý´Â´Ù. - Ç¥ÁØ ÀÔÃâ·Â ¸ðÀ½Àº ÆÄÀÌÇÁ¸¦ ¸¸µé°í ±× ÆÄÀÌÇÁ·ÎºÎÅÍ Àаųª ±× ÆÄÀÌÇÁ¿¡ ¾²´Â ´Ù¸¥ ÇÁ·Î¼¼½º¸¦ ÃʱâÈÇØ ÁÖ´Â ±â´ÉÀ» Á¦°øÇÑ´Ù. #include FILE *popen(char *command, char *type); command´Â ²®µ¥±â ¸í·É¾î ÁÙÀÌ´Ù. ÀÌ°ÍÀº Bourne Shell¿¡¼ ±¸µ¿µÇ¸ç, PATH ȯ°æº¯¼ö¸¦ command¸¦ ã´Âµ¥ »ç¿ëÇÑ´Ù. È£Ãâ ÇÁ·Î¼¼½º¿Í ÁöÁ¤µÈ ¸í·É¾î »çÀÌ¿¡ ÆÄÀÌÇÁ°¡ Çϳª ¸¸µé¾îÁø´Ù. popen¿¡¼ µ¹¾Æ¿À´Â °ªÀº ¹®ÀÚ¿ type¿¡ µû¶ó ÀÔ·Â ¶Ç´Â Ãâ·Â¿¡ »ç¿ëµÇ´Â Ç¥ÁØ ÀÔÃâ·Â FILE Áö½ÃÀÚ°¡ µÈ´Ù. ÀÌ typeÀÇ °ªÀÌ rÀ̸é È£Ãâ ÇÁ·Î¼¼½º´Â commandÀÇ Ç¥ÁØ Ãâ·ÂÀ» Àаí w À̸é È£Ãâ ÇÁ·Î¼¼½º´Â ±× ¸í·É¾îÀÇ Ç¥ÁØÀԷ¿¡ ¾´´Ù. popen ½Ã½ºÅÛ È£ÃâÀÌ ½ÇÆÐÇϸé NULL°ªÀÌ µ¹¾Æ¿Â´Ù. ¾Æ·¡ÀÇ ÇÔ¼ö´Â #include int pclose(FILE *stream); popen¿¡ ÀÇÇØ ¸¸µé¾îÁø ÀÔÃâ·Â ¿¬¼Ó ó¸®(stream)¸¦ ´Ý°í, commandÀÇ exit »óŸ¦ µ¹·ÁÁØ´Ù. ¸¸¾à ÀÌ popen¿¡ ÀÇÇØ ¿¬¼Ó 󸮰¡ ¸¸µé¾îÁöÁö ¾Ê¾Ò´Ù¸é -1ÀÌ º¹±ÍµÇ´Ù. #include #define MAXLINE 10 main() { int n; char line[MAXLINE], command[MAXLINE+10]; FILE *fp; if (fgets(line,MAXLINE,stdin) == NULL) ---> MAXLINEÀº ÀÐÇôÁú Å©±â¸¦ Á¦ÇÑ,lineÀº ÀúÀåÀå¼Ò printf("filename read error"); sprintf(command, "cat %s", line); ---> line¿¡´Â cat´ÙÀ½¿¡ ¿À´Â ÀÎÀÚ°¡ ÀúÀåµÈ´Ù if ( (fp=popen(command,"r")) ==NULL) printf("popen error"); while ((fgets(line,MAXLINE,fp)) != NULL) { n = strlen(line); if (write(1,line,n) != n) ---> 1Àº fd·Î¼ Ç¥ÁØÃâ·ÂÀ» ÀǹÌÇÔ printf("data write error"); } if (ferror(fp)) printf("fgets error"); pclose(fp); exit(0); } # a.out Á¤¸® Çϸé cat Á¤¸®°¡ ½ÇÇàÀÌ µÈ´Ù. popenÇÔ¼ö´Â ¶Ç ´Ù¸¥ ¿ëµµ·Î ,ÇÁ·Î¼¼½ºÀÇ ÇöÀç ÀÛ¾÷ ÈÀÏ ¸íºÎ¸¦ ¾Ë¾Æ³»´Âµ¥ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ½Ã½ºÅÛ È£Ãâ chdirÀÌ ÇÁ·Î¼¼½ºÀÇ Çö ÀÛ¾÷ ÈÀÏ ¸íºÎ¸¦ º¯È½Ãų ¼ö ÀÖÀ½À» »ó±âÇÏ°í, ÇÑÆíÀ¸·Î ÇöÀçÀÇ °ªÀ» ¾òÀ» ¼ö ÀÖ´Â ½Ã½ºÅÛ È£ÃâÀº ¾ø´Ù´Â °Í¿¡ À¯ÀÇÇÏÀÚ. System V¿¡¼´Â getcwdÇÔ¼ö·Î ÀÌ ÀÛ¾÷À» ÇÒ ¼ö ÀÖ°í, 4.3BSD¿¡¼´Â getwd°¡ ºñ½ÁÇÑ ÀÛ¾÷À» ÇØ ÁÖÁö¸¸ ¶È°°Áö´Â ¾Ê´Ù. ´ÙÀ½Àº À¯´Ð½ºÀÇ pwd ¸í·É¾î¸¦ »ç¿ëÇÏ¿© ÇöÀçÀÇ ÀÛ¾÷ ÈÀÏ ¸íºÎ¸¦ ¾Ë¾Æ³»°í, ±×°ÍÀ» ÀμâÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. #include #define MAXLINE 255 main() { FILE *fp; char line[MAXLINE]; if ( (fp=popen("/bin/pwd","r"))==NULL) printf("popen error"); if (fgets(line,MAXLINE,fp) == NULL) --> ¿©±â¼ lineÀº pwdÀÇ ½ÇÇà°á°ú°¡ ÀúÀåµÊ printf("fgets error"); printf("%s",line); pclose(fp); exit(0); } ÆÄÀÌÇÁÀÇ »ç¿ë¿¡ ÀÖ¾î °¡Àå Å« ´ÜÁ¡Àº °°Àº ¾î¹öÀÌ ÇÁ·Î¼¼½º¸¦ °¡Áø ÇÁ·Î¼¼½ºµé »çÀÌ¿¡¼¸¸ ÆÄÀÌÇÁ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ÆÄÀÌÇÁ°¡ ÇÑ ÇÁ·Î¼¼½º¿¡¼, ½Ã½ºÅÛ È£Ãâ fork·Î ¸¸µé¾îÁø ´Ù¸¥ ÇÁ·Î¼¼½ºµé¿¡°Ô¸¸ Àü´ÞÀÌ µÇ±â¶§¹®À̸ç, ¾î¹öÀÌ ÇÁ·Î¼¼½º¿Í ½Ã½ºÅÛ È£Ãâ forkÈÄ¿¡ ¸¸µé¾îÁø ÀÚ½ÄÇÁ·Î¼¼½ºµé »çÀÌ¿¡¼¸¸ ¿¸° ÈÀÏÀÌ °øÀ¯µÇ±â ¶§¹®ÀÌ´Ù. ÀüÇô °ü°è°¡ ¾ø´Â µÎ ÇÁ·Î¼¼½º¸¦ ´ë»óÀ¸·Î ±× »çÀÌ¿¡ ÆÄÀÌÇÁ¸¦ ¸¸µé°í ±×°ÍÀ» IPC¸¦ À§ÇØ »ç¿ëÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀº ¾ø´Ù. o FIFOs - FIFO´Â First In First Out. Áï ¸ÕÀú µé¾î¿Â °ÍÀÌ ¸ÕÀú ³ª°£´Ù´Â ¶æÀÇ ¿µ¹® ¾àÀÚÀÌ´Ù. À¯´Ð½º FIFO´Â ÆÄÀÌÇÁ¿Í ºñ½ÁÇѵ¥ , µ¥ÀÌŸÀÇ ÀϹæ È帧À» Á¦°øÇÏ°í, ±×°÷ FIFO¿¡ ù¹ø° ¾²ÀÎ ¹ÙÀÌÆ®°¡ ±×°ÍÀ¸·ÎºÎÅÍ ÀÐ¾î ³¾¼ö Àִ ù¹ø° ¹ÙÀÌÆ®ÀÌ´Ù. ±×·¯³ª ÆÄÀÌÇÁ¿Í´Â ´Þ¸® FIFO´Â ±×°Í ÀÚü¿¡ À̸§ÀÌ ºÙ¾î ÀÖ¾î ¼·Î ¹«°üÇÑ ÇÁ·Î¼¼½ºµéÀÌ ÇϳªÀÇ FIFO¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. µû¶ó¼ Áö¸í ÆÄÀÌÇÁ(named pipe)¶ó°í ºÎ¸£±âµµ ÇÑ´Ù. FIFO´Â System V¿¡¼ Á¦°øÇÏ°í, 4.3BSD¿¡¼´Â Á¦°øÇÏÁö ¾Ê´Â´Ù. o ¿¬¼Óó¸®¿Í ¼Ò½Ä(Streams and Messages) - Áö±Ý±îÁö º¸¾Æ¿Ô´ø ÆÄÀÌÇÁ¿Í FIFOµéÀÇ ¿¹´Â À¯´Ð½º¿¡ ÀûÇÕÇÑ ¿¬¼Ó ó¸® ÀÔÃâ·Â ¸ðµ¨À» »ç¿ëÇÏ°í ÀÖ´Ù. ¿©±â¿¡´Â ·¹ÄÚµåÀÇ °æ°è°¡ ¾øÀ¸¸ç, µû¶ó¼ Àбâ¿Í ¾²±â °úÁ¤¿¡¼ µ¥ÀÌŸ¸¦ °Ë»çÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ¿¹¸¦ µé¾î ÆÄÀÌÇÁ·ÎºÎÅÍ 100¹ÙÀÌÆ®¸¦ Àд ÇÁ·Î¼¼½º´Â ±× ÆÄÀÌÇÁ¿¡ µ¥ÀÌŸ¸¦ Àû¾ú´ø ÇÁ·Î¼¼½º°¡ Çѹø¿¡ 100 ¹ÙÀÌÆ®¸¦ Àû¾ú´ÂÁö, ¾Æ´Ï¸é 20 ¹ÙÀÌÆ®¾¿ ´Ù¼¸¹øÀ» ½è´ÂÁö, ȤÀº 50¹ÙÀÌÆ®¾¿ µÎ¹øÀ» ½è´Â Áö ¾Ë¼ö ¾ø´Ù. ¶ÇÇÑ ÇÑ ÇÁ·Î¼¼½º°¡ ÆÄÀÌÇÁ¿¡ 55 ¹ÙÀÌÆ®¸¦ Àû°í ´Ù¸¥ ÇÁ·Î¼¼½º°¡ 45¹ÙÀÌÆ®¸¦ ¾´ °æ¿ìµµ ÀÖÀ» ¼ö ÀÖ´Ù. ¿©±â¿¡¼ µ¥ÀÌŸ´Â ½Ã½ºÅÛ¿¡ ÀÇÇØ ¾Æ¹«·± Çؼ®ÀÌ °¡ÇØÁöÁö ¾Ê´Â ´Ü¼øÇÑ ¹ÙÀÌÆ®ÀÇ ¿¬¼ÓÀÏ »ÓÀÌ´Ù. ¸¸¾à ¾î¶² Çؼ®ÀÌ ¿ä±¸µÈ´Ù¸é, ¾²±â ÇÁ·Î¼¼½º¿Í Àбâ ÇÁ·Î¼¼½º´Â ±× Çؼ®¿¡ µ¿ÀÇÇØ¾ß ÇÏ°í, ÀÚ±â ÀÚ±â ÀڽŵéÀÌ ¾Ë¾Æ¼ ÇØ¾ß ÇÑ´Ù. ±×·¯³ª ÇÁ·Î¼¼½º°¡ Àü´ÞÇÏ´Â µ¥ÀÌŸ¿¡ ¾î¶² ±¸Á¶¸¦ ºÎ¿©ÇÏ°íÀÚ ÇÒ ¶§°¡ ÀÖ´Ù. µ¥ÀÌŸ°¡ °¡º¯ ±æÀÌÀÇ ¼Ò½ÄÀ¸·Î ÀÌ·ç¾îÁø °æ¿ì°¡ ´ëÇ¥ÀûÀÎ ¿¹·Î, ÀÌ °æ¿ì ÀдÂÀÚ·Î ÇÏ¿©±Ý, ¼Ò½ÄÀÇ °æ°è°¡ ¾î´À °÷ÀÎÁö¸¦ ¾Ë°Ô ÇÏ¿© ÇϳªÀÇ ´ÜÀ§ ¼Ò½Ä¸¸À» ÀÐ¾î °¡µµ·Ï ÇØ¾ß ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. IPC ±â´ÉÀ» ¹ÙÅÁÀ¸·Î ÇÑ ¿¬¼Ó ó¸® À§¿¡ ¼Ò½Ä ±¸Á¶¸¦ ºÎ¿©ÇÒ ÇÊ¿ä°¡ ÀÖ´Â ¸¹Àº À¯´Ð½º ÇÁ·Î¼¼½ºµéÀº °¢ ¼Ò½ÄÀ» ºÐ¸®Çϱâ À§ÇØ ÁÙ¹Ù²Þ ¹®ÀÚ(newline character)¸¦ »ç¿ëÇÏ°í ÀÖ´Ù. ¾²±â ÇÁ·Î¼¼½º´Â °¢ ¼Ò½Ä¿¡ ÁÙ¹Ù²Þ ¹®ÀÚ¸¦ ÷°¡ÇÏ°í Àбâ ÇÁ·Î¼¼½º´Â IPCÀÇ Ã¤³Î·ÎºÎÅÍ Çѹø¿¡ ÇÑ ÁÙ¾¿ ÀÐ¾î ¿Â´Ù. ¶ÇÇÑ ÆÄÀÌÇÁ³ª FIFOÀÇ Àб⠾²±â¸¦ À§ÇØ Ç¥ÁØ ÀÔÃâ·Â ¸ðÀ½À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÆÄÀÌÇÁ¸¦ ¿±â À§Çؼ´Â ½Ã½ºÅÛ È£Ãâ pipe¸¦ »ç¿ëÇÏ´Â ¹æ¹ý»ÓÀÌ°í, À̶§ ÈÀÏ ÁöÁ¤ ¹øÈ£°¡ µé¾Æ¿À¹Ç·Î Ç¥ÁØ ÀÔÃâ·ÂÇÔ¼ö fdopenÀº ¹Ýµå½Ã Ç¥ÁØ ÀÔÃâ·Â ¿¬¼Ó ó¸®¿Í ¿¸° ÈÀÏ ÁöÁ¤¹øÈ£¿Í °áºÎ½ÃÄÑ »ç¿ëÇÏ¿©¾ß¸¸ ÇÑ´Ù. FIFO´Â À̸§À» ÀÚÁö¹Ç·Î Ç¥ÁØ ÀÔÃâ·Â fopenÀ» »ç¿ëÇÏ¿© ¿ ¼ö ÀÖ´Ù. o À̸§ ¿µ¿ª (Name Spaces) - ÆÄÀÌÇÁ´Â À̸§À» °®°í ÀÖÁö ¾ÊÁö¸¸ ,FIFO´Â ÀÚ½ÅÀ» ½Äº°ÇÒ ¼ö ÀÖµµ·Ï À¯´Ð½º °æ·Î¸íÀ» °®´Â´Ù. ´ÙÀ½Àý¿¡¼ IPCÀÇ ´Ù¸¥ ÇüŸ¦ ´Ù·ê ¶§´Â, Ãß°¡·Î À̸§À» ºÙÀÌ´Â ¿©·¯°¡Áö °ü·Ê¸¦ »ç¿ëÇÑ´Ù. IPCÀÇ ÁÖ¾îÁø ÇüÅ¿¡ ´ëÇØ »ç¿ë°¡´ÉÇÑ À̸§ÀÇ ÁýÇÕÀ» À̸§ ¿µ¿ªÀ̶ó ÇÑ´Ù. ÆòÀÌÇÑ ÆÄÀÌÇÁ°¡ ¾Æ´Ñ IPCÀÇ ¸ðµç ÇüÅ¿¡¼ ¼Ò½ÄÀ» "±³È¯"Çϱâ À§ÇØ ¾î¶»°Ô °í°´°ú ÀϲÛÀÌ ¿¬°áµÇ´Â Áö¸¦ À̸§ÀÌ ±ÔÁ¤ÇϹǷΠÀ̸§ ¿µ¿ªÀº Áß¿äÇÏ´Ù. ÀÌ Àå¿¡¼ ¿ì¸®°¡ ´Ù·ê ½Ã½ºÅÛÀÇ ÇÁ·Î¼¼½º»çÀÌ¿¡ ´ëÇÑ IPC¹æ¹ýÀ» ±â¼úÇÒ ¶§´Â »ç¿ë °¡´ÉÇÑ À̸§ ¿µ¿ª¿¡¼ À̸§À» ¼±ÅÃÇÏ´Â °ÍÀÌ Áß¿äÇØ Áø´Ù. ´ÙÀ½Àº IPCÀÇ ¿©·¯ °¡Áö ÇüÅ¿¡¼ »ç¿ëÇÏ´Â À̸§ÀÇ °ü·Ê¸¦ ¿ä¾àÇÑ °ÍÀÌ´Ù. ¸¶Áö¸· ¿Àº ÇÁ·Î¼¼½º°¡ ¾î¶»°Ô ƯÁ¤ ÇüÅÂÀÇ IPC¿¡ Á¢±ÙÇϴ°¡¸¦ ±ÔÁ¤ÇÏ°í ÀÖ´Ù. IPC¸¦ À§ÇÑ À̸§ °ø°£ -------------------------------------------------------------------- | IPC type | Name space | Identification | -------------------------------------------------------------------- | pipe | (no name) | file descriptor | | FIFO | pathname | file descriptor | | message queue | key_t key | identifier | | shared memory | key_t key | identifier | | semaphore | key_t key | identifier | | socket-Unix domain | pathname | file descriptor | | socket-other domains |(domain dependent) | file descriptor | -------------------------------------------------------------------- o key_t ¿¼è(keys) - System V Ç¥ÁØ C¸ðµë¿¡¼ Á¦°øÇÏ´Â ÇÔ¼ö ftokÀº °æ·Î¸í°ú °úÁ¦ ½Äº°ÀÚ¸¦ System V IPC¿¼è·Î ¹Ù²Ù¾î ÁØ´Ù. (¾î¶² ÀÌÀ¯ÀÎÁö´Â ¸ð¸£Áö¸¸, ÀÌ ÇÔ¼ö´Â ½ÇÁ¦ ÀÚ½ÅÀÇ À̸§º¸´Ù´Â stdipc¶ó´Â À̸§À¸·Î System VÀÇ »ç¿ë ¼³¸í¼¿¡ Ç¥½ÃµÇ¾î ÀÖ´Ù) ÀÌ System V IPC¿¼èµéÀº ´ÙÀ½ Àýµé¿¡¼ ¼³¸íÇÒ ¼Ò½Ä ´ë·Õ, °øÀ¯±â¾ï Àå¼Ò ±×¸®°í Â÷´Ü Ç¥½Ã±â¸¦ ½Äº°Çϴµ¥¿¡ »ç¿ëÇÑ´Ù. #include #include key_t ftok(char *pathname, char proj); ÈÀÏ ¿¡¼ ÀüÇüÀûÀÎ 32ºñÆ®ÀÇ Á¤¼öÇüÀÎ key_tÀÇ µ¥ÀÌŸÇüÀ» Á¤ÀÇÇÏ°í ÀÖ´Ù. IPC ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼ Àϲ۰ú °í°´Àº ¸ðµÎ ±× ÀÀ¿ë ÇÁ·Î±×·¥¿¡ Ưº°ÇÑ Àǹ̸¦ Áö´Ï´Â ´ÜÀÏ °æ·Î¸í¿¡ ÀÏÄ¡ÇØ¾ß ÇÑ´Ù. ±× °æ·Î¸íÀº ÀÏ²Û Æļö²ÛÀÇ °æ·Î¸íÀϼöµµ ÀÖ°í, ÀϲÛÀÌ »ç¿ëÇÏ´Â ÀÏ¹Ý µ¥ÀÌŸÈÀÏÀÇ °æ·Î¸í ¶Ç´Â ½Ã½ºÅÛ ³»ÀÇ ¾î¶² °æ·Î¸íÀϼöµµ ÀÖ´Ù. ¸¸¾à °í°´°ú ÀϲÛÀÌ ±×µé »çÀÌ¿¡ ÇϳªÀÇ IPC ä³Î¸¸À» »ç¿ëÇÑ´Ù¸é, proj=1À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´Ù¼öÀÇ IPCä³ÎÀÌ ÇÊ¿äÇϸé, ¿¹¸¦ µé¾î °í°´À¸·ÎºÎÅÍ ÀϲÛÀ¸·Î °¡´Â ä³Î Çϳª¿Í ÀϲÛÀ¸·ÎºÎÅÍ °í°´À¸·Î °¡´Â ´Ù¸¥ ÇϳªÀÇ Ã¤³ÎÀÌ ÇÊ¿äÇÑ °æ¿ì, ÇÑ Ã¤³ÎÀº proj=1, ´Ù¸¥ ä³ÎÀº proj=2¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Çѹø pathname°ú proj°¡ °í°´°ú Àϲۿ¡ ÀÇÇØ ÀÏÄ¡µÇ¸é À̵éÀº °°Àº IPC ¿¼è·Î º¯È¯Çϱâ À§ÇØ ÇÔ¼ö ftokÀ» È£ÃâÇÒ ¼ö ÀÖ´Ù. pathnameÀÌ Á¸ÀçÇÏÁö ¾Ê°Å³ª, È£Ãâ ÇÁ·Î¼¼½º°¡ ±× pathname¿¡ Á¢±ÙÇÒ ¼ö ¾øÀ» ¶§, ftokÀº -1À» µ¹·Á ÁØ´Ù. ÀÚ½ÅÀÇ pathnameÀÌ ¿¼è¸¦ ¸¸µå´Âµ¥ »ç¿ëµÈ ÈÀÏÀº Á¸ÀçÇÏ´Â µ¿¾È¿¡´Â Àϲۿ¡ ÀÇÇؼ ¸¸µé¾îÁö°Å³ª Á¦°ÅµÉ ¼ö ¾ø´Âµ¥, ÀÌ´Â ÈÀÏÀÌ ¸¸µé¾îÁú¶§¸¶´Ù »õ·Î¿î i-node¹øÈ£¸¦ °¡Á¤ÇϹǷΠ´ÙÀ½ È£ÃâÀÚ¿¡°Ô ftokÀÌ µ¹·Á ÁÖ´Â ¿¼è°¡ ´Ù¸¦ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ftok¿¡ ´ëÇÑ µ¶¸³ º¯¼ö proj´Â 8ºñÆ®ÀÇ ¹®ÀÚÀÌÁö, ¹®ÀÚ¿¿¡ ´ëÇÑ Áö½ÃÀÚ°¡ ¾Æ´ÔÀ» ¸í½ÉÇ϶ó. ÀϹÝÀûÀ¸·Î ÇÔ¼ö ftokÀº ´ÙÀ½°ú °°ÀÌ ±¸ÇöÇÑ´Ù. ÇÔ¼ö ftokÀº 8ºñÆ®ÀÇ proj°ªÀ» ÁöÁ¤µÈ pathname¿¡ ÇØ´çÇÏ´Â µð½ºÅ© ÈÀÏÀÇ i-node¹øÈ£ °ª°ú µð½ºÅ© ÈÀÏÀÌ À§Ä¡ÇÏ´Â ÈÀÏ ½Ã½ºÅÛÀÇ ºÎ±â±â ¹øÈ£¸¦ Á¶ÇÕÇÑ´Ù. ÀÌ ¼¼ °ªÀÇ Á¶ÇÕÀÌ 32ºñÆ®ÀÇ ¿¼è¸¦ ¸¸µé¾î³»´Â °ÍÀÌ´Ù. ÈÀÏÀÌ Á¸ÀçÇÏ´Â ÈÀÏ ½Ã½ºÅÛ ³»¿¡¼ÀÇ ÈÀÏÀÇ i-node ¹øÈ£¸¦ (´ÜÀÏ µð½ºÅ© Á¦¾î±âÀÇ µð½ºÅ© ºÐÇÒ¿¡ ÇØ´çÇÏ´Â)ÈÀÏ ½Ã½ºÅÛÀÇ ºÎ±â±â ¹øÈ£¿Í °°ÀÌ »ç¿ëÇϹǷνá ÀÌ ÇÔ¼ö´Â °íÀ¯ÇÑ ¿¼è °ªÀ» ¸¸µé¾î³¾·Á°í ÇÑ´Ù. ½Ã½ºÅÛ³»ÀÇ °¡´ÉÇÑ ¸ðµç °æ·Î¸í¿¡ ´ëÇØ °íÀ¯ÇÑ ¿¼è°ªÀ» º¸ÀåÇϱâ À§ÇØ 32ºñÆ®ÀÇ i-node ¹øÈ£¿Í 8ºñÆ®ÀÇ ÁÖ±â±â ¹øÈ£, ±×¸®°í 8ºñÆ®ÀÇ ºÎ±â±â ¹øÈ£¸¦ Á¶ÇÕÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ftokÀÌ »ç¿ëÇÏ´Â ¾Ë°í¸®ÁòÀº ¼·Î ´Ù¸¥ µÎ °æ·Î¸íÀÌ °°Àº Å°ÀÌ °ªÀ» ¸¸µé¾î ³»´Â È®·üÀº 0Àº ¾Æ´ÏÁö¸¸ ¸Å¿ì ÀÛÀº ŸÇù¾ÈÀÌ´Ù. ½ÇÁ¦·Î i-node¹øÈ£°¡ 16ºñÆ®º¸´Ù Å« °æ¿ì´Â °ÅÀÇ ¾øÀ¸¹Ç·Î ¼·Î ´Ù¸¥ µÎ °æ·Î¸íÀÌ °°Àº ¿¼è¸¦ ¸¸µé¾î³¾·Á¸é µÎ ÈÀÏÀÌ °°Àº i-node¹øÈ£¿Í °°Àº ºÎ±â±â ¹øÈ£¸¦ °¡Áö¸é µÇ°í ÁÖ±â±â ¹øÈ£´Â °ü°è°¡ ¾ø´Ù. o System V IPC - ´ÙÀ½ ¼¼°¡Áö ÇüÅÂÀÇ IPC¸¦ ÃÑĪÇÏ¿© "System V IPC"¶ó°í ÇÑ´Ù. . ¼Ò½Ä ´ë·Õ(message queues) . Â÷´Ü Ç¥½Ã±â(semaphores) . °øÀ¯±â¾ï Àå¼Ò(shared memory) À̵éÀº À̵éÀ» ÀÌ¿ëÇÏ´Â ½Ã½ºÅÛ È£Ãâ °üÁ¡¿¡¼ ¸¹Àº À¯»çÁ¡À» °¡Áö°í ÀÖ°í, ¶Ç ¾Ë¸ÍÀÌ°¡ À¯ÁöÇÏ´Â Á¤º¸ÀÇ °üÁ¡¿¡¼µµ ¸Å¿ì ºñ½ÁÇÏ´Ù. À̵éÀÇ ½Ã½ºÅÛ È£ÃâÀº ´ÙÀ½°ú °°ÀÌ ¿ä¾àÇÒ ¼ö ÀÖ´Ù. ------------------------------------------------------------------------------------------ | | Message queue | Semaphore | Shared memory | ------------------------------------------------------------------------------------------ | include file | | | | | system call to create or open | msgget | semget | shmget | | system call for control operations | msgctl | semctl | shmctl | | system calls for IPC operations | msgsnd | semop | shmat | | | msgrcv | | shmdt | ------------------------------------------------------------------------------------------ ¾Ë¸ÍÀÌ´Â °¢ IPCä³Î¿¡ ´ëÇؼµµ ÈÀÏÀ» ´Ù·ç±â À§ÇÑ Á¤º¸¿Í ºñ½ÁÇÑ Á¤º¸ÀÇ ±¸Á¶¸¦ °®´Â´Ù. struct ipc_perm { ushort uid; /* owner's user id */ ushort gid; /* owner's group id */ ushort cuid; /* creator's user id */ ushort cgid; /* creator's group id */ ushort mode; /* access modes */ ushort seq; /* slot usage sequence number */ key_t key; /* key */ }; ÀÌ ±¸Á¶´Â System V IPC ½Ã½ºÅÛ È£Ãâ¿¡¼ »ç¿ëÇÏ´Â ¸í¹éÇÑ »ó¼öµé°ú ÇÔ²² ¿¡ Á¤ÀǵǾî ÀÖ´Ù. ÀÌ ±¸Á¶¸¦ »ç¿ëÇÏ°í ¶Ç º¯°æÇϱâ À§Çؼ´Â ¼¼°¡ÁöÀÇ ctl ½Ã½ºÅÛ È£ÃâÀ» »ç¿ëÇÑ´Ù. ¼¼°³ÀÇ ½Ã½ºÅÛ È£Ãâ getÀº ÇϳªÀÇ IPC ä³ÎÀ» ¸¸µé°Å³ª ¿±âÀ§ÇØ »ç¿ëµÇ¸ç ¸ðµÎ key_tÇüÀÇ ¿¼è °ªÀ» ÃëÇÏ°í Á¤¼öÇü ½Äº°ÀÚ¸¦ µÇµ¹·Á ÁØ´Ù. ÀÌÀÇ ´Ü°èº° ¼ø¼´Â ¾Æ·¡¿¡ Ç¥½ÃÇÏ¿´´Ù. < ftok¸¦ ÀÌ¿ëÇÑ IPC id ¸¦ ¸¸µå´Â °úÁ¤ > ------------ ------------ char *path | ftok() | key_t key | msgget() | int id -------------> | | ----------> | semget() | ---------> char proj ------------ | shmget() | ------------ ÀÌ ¼¼°³ÀÇ get ½Ã½ºÅÛ È£ÃâÀº ¸ðµÎ°¡ IPCä³Î¿¡ ´ëÇÑ modeÀÇ ÇÏÀ§ ¼ø¼ 9ºñÆ®¸¦ ÁöÁ¤ÇÏ°í, »õ·Î¿î IPC ä³ÎÀ» ¸¸µéÁö, ¶Ç´Â ÀÌ¹Ì Á¸ÀçÇϴ ä³ÎÀ» ÂüÁ¶ÇÒ °ÍÀÎÁö¸¦ ÁöÁ¤Çϱâ À§ÇØ µ¶¸³ º¯¼ö flag¸¦ ÃëÇÑ´Ù. »õ·Î¿î IPCä³ÎÀ» ¸¸µéÁö, ¶Ç´Â ÀÌ¹Ì Á¸ÀçÇϴ ä³ÎÀ» ÂüÁ¶ÇÏ°í ÀÖ´ÂÁö¿¡ ´ëÇÑ ±ÔÄ¢Àº ´ÙÀ½°ú °°´Ù. . IPC_PRIVATEÀÇ ¿¼è °ªÀ» ÁöÁ¤Çϸé, °íÀ¯ÇÑ IPCä³ÎÀÌ ¸¸µé¾îÁüÀÌ º¸ÀåµÈ´Ù. ftokÀ¸·Î ÇÏ¿©±Ý IPC_PRIVATEÀÇ ¿¼è °ªÀ» ¸¸µé¾î ³»µµ·Ï ÇÒ ¼ö ÀÖ´Â pathname°ú projÀÇ Á¶ÇÕÀº ¾ø´Ù. . flag³¹¸»ÀÇ IPC_CREATºñÆ®¸¦ 1·Î Çϸé ÁöÁ¤µÈ ¿¼è¿¡ ´ëÇÏ¿© Ç׸ñÀÌ Á¸ÀçÇÏÁö ¾Ê´Â°æ¿ì »õ·Î¿î Ç׸ñÀ» ¸¸µé¾î ÁØ´Ù. ÀÌ¹Ì Ç׸ñÀÌ Á¸ÀçÇÏ°í ÀÖ´Ù¸é, ÀÌ Ç׸ñÀº µÇµ¹¾Æ ¿Â´Ù. . flag³¹¸»ÀÇ IPC_CREAT¿Í IPC_EXCL ºñÆ®¸¦ ¸ðµÎ 1·ÎÇÏ¸é ¸¸µé°íÀÚ ÇÏ´Â Ç׸ñÀÌ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì¿¡ ÇÑÇØ ÁöÁ¤µÈ ¿¼è¿¡ ´ëÇÑ »õ·Î¿î Ç׸ñÀ» ¸¸µé¾î ÁØ´Ù. ¸¸¾à, IPCä³ÎÀÌ ÀÌ¹Ì Á¸ÀçÇÏ°í ÀÖÀ¸¸é ¿¡·¯°¡ ¹ß»ýÇÑ´Ù. IPC_EXCLºñÆ®´Â È£ÃâÀÚ°¡ IPCä³ÎÀ» ¹èŸÀûÀ¸·Î Á¢±ÙÇϵµ·Ï º¸ÀåÇØÁÖÁö´Â ¾Ê´Â´Ù´Âµ¥¿¡ À¯ÀÇÇØ¾ß ÇÑ´Ù. ÀÌ°ÍÀÇ ±â´ÉÀº »õ·Î¿î IPCä³ÎÀÌ ¸¸µé¾îÁö°Å³ª, ¶Ç´Â ±×·¸Áö ¾ÊÀº °æ¿ì ¿¡·¯°¡ µ¹·ÁÁüÀ» º¸ÀåÇÒ »ÓÀÌ´Ù. ½ÉÁö¾î´Â IPC_CREAT¿Í IPC_EXCL ¸ðµÎ¸¦ ÁöÁ¤ÇÏ°í »õ·Î¿î IPC ä³ÎÀ» ¸¸µå´Â °æ¿ì¿¡µµ ¸¸¾à ´Ù¸¥ »ç¿ëÀÚµéÀÌ ±× ä³ÎÀÇ mode ³¹¸»ÀÇ ÇÏÀ§ 9ºñÆ®¿¡ ÀûÀýÇÑ Çã°¡¸¦ °®°í ÀÖÀ¸¸é, ¿ª½Ã ±× ä³Î¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. . IPC_CREATºñÆ®¸¦ 1·Î ÇÏÁö ¾Ê°í IPC_EXCL¸¸À»1·Î ÇÏ´Â °æ¿ì´Â ¾Æ¹«·± Àǹ̰¡ ¾ø´Ù. < IPC ä³ÎÀ» ¿°Å³ª ¸¸µé ¶§ÀÇ ³í¸® > -------------------------------------------------------------------------- | flag argument | key Á¸Àç¾ÈÇÒ¶§ | key°¡ ÀÌ¹Ì Á¸ÀçÇÒ¶§ | -------------------------------------------------------------------------- | no special flags | error,errno=ENOENT | OK | | IPC_CREAT | OK. creates new entry | OK | | IPC_CREAT | IPC_EXCL | OK. creates new entry | error, errno=EEXIST | -------------------------------------------------------------------------- À§¿¡¼ °¡¿îµ¥ ÁÙ¿¡¼ IPC_CREATÇ¥½Ã±â°¡ IPC_EXCL¾øÀÌ »ç¿ëµÇ´Â °æ¿ì, »õ·Î¿î Ç׸ñÀÌ ¸¸µé¾î Á³´ÂÁö ¶Ç´Â ÇöÀç Á¸ÀçÇÏ°í ÀÖ´Â Ç׸ñÀ» ÂüÁ¶ÇÏ°í ÀÖ´ÂÁö¸¦ ¾Ë ¼ö ÀÖ´Â ¹æ¹ýÀº ¾ø´Ù´Â °Í¿¡ ÁÖÀÇÇÏÀÚ. IPC_CREATÇ¥½Ã±â¿Í ÇÔ²² ½Ã½ºÅÛ È£Ãâ getÁß Çϳª¸¦ »ç¿ëÇÏ¿© »õ·Î¿î IPC ä³ÎÀ» ¸¸µé ¶§¸¶´Ù µ¶¸³º¯¼ö flagÀÇ ÇÏÀ§ 9ºñÆ®´Â ipc_perm±¸Á¶³»ÀÇ mode ³¹¸»À» ÃʱâÈÇÑ´Ù. ºÎ°¡ÀûÀ¸·Î cuid¿Í cgidºÎºÐµµ È£Ãâ ÇÁ·Î¼¼½ºÀÇ À¯È¿ »ç¿ëÀÚ ID¿Í À¯È¿ Áý´Ü ID¸¦ °¢°¢ °®°Ô µÈ´Ù. ipc_perm±¸Á¶³»ÀÇ uid¿Í gid¶ÇÇÑ È£Ãâ ÇÁ·Î¼¼½ºÀÇ À¯È¿ »ç¿ëÀÚ ID¿Í À¯È¿ Áý´Ü ID¸¦ °¢°¢ °®°Ô µÈ´Ù. ÀÌ µÎ°¡Áö ID´Â "¼ÒÀ¯ÀÚ ID(owner ID)"¶ó°í ÇÏ´Â ¹Ý¸é cuid¿Í cgid´Â "»ý¼ºÀÚ ID(creator ID)"¶ó°í ÇÑ´Ù. ÀÌ »ý¼ºÀÚ ID´Â Àý´ë·Î º¯ÇÏÁö ¾ÊÁö¸¸, ÇÁ·Î¼¼½º°¡ ¼ÒÀ¯ÀÚ ID¸¦ º¯°æÇÏ´Â °ÍÀº IPCÀåÄ¡¿¡ ´ëÇÑ ctl½Ã½ºÅÛ È£Ãâ(msgctl, semctl, ¶Ç´Â shmctl)À» È£ÃâÇÔÀ¸·Î½á °¡´ÉÇÏ´Ù. ÀÌ ¼¼°¡Áö ½Ã½ºÅÛ È£Ãâ ctlÀº ÇÑ ÇÁ·Î¼¼½º°¡ IPC ä³ÎÀÇ mode ³¹¸»ÀÇ ÇÏÀ§ 9ºñÆ®¸¦ ¹Ù²Ù´Â °Í¿¡ Çã¿ëÇÑ´Ù. ¾î¶² ÇÁ·Î¼¼½º°¡ IPCä³ÎÀ» Á¢±ÙÇÒ ¶§¸¶´Ù ´ÙÀ½ µÎ°¡Áö ¼öÁØÀÇ °Ë»ç°¡ ÀÌ·ç¾îÁø´Ù. 1. ÇÑ ÇÁ·Î¼¼½º°¡ get ½Ã½ºÅÛ È£Ãâ ÁßÀÇ Çϳª¸¦ ÀÌ¿ëÇÏ¿© ÇöÀç Á¸ÀçÇÏ´Â IPCä³Î¿¡ Á¢±ÙÇÒ ¶§¸¶´Ù È£ÃâÀÚÀÇ flag µ¶¸³ º¯¼ö°¡ mode³¹¸»¿¡ ¾ø´Â Á¢±Ù ºñÆ®¸¦ ÁöÁ¤ÇÏÁö ¾Ê¾Ò´Â°¡¸¦ Ãʱ⿡ °Ë»çÇÑ´Ù. ¿¹¸¦ µé¾î ÇÑ ÀÏ²Û ÇÁ·Î¼¼½º°¡ Áý´Ü Àбâ¿Í ±âŸ Àбâ Çã°¡ ºñÆ®¸¦ 0À¸·Î ÀÔ·Â ¼Ò½Ä ´ë·Õ¿¡ ´ëÇÑ mode³¹¸»À» Á¤ÇÒ ¼ö°¡ ÀÖ´Ù. ÀÌ·¯ÇÑ ºñÆ®µéÀ» 1·Î ÇÏ´Â flagµ¶¸³º¯¼ö¸¦ °¡Áø ÇÁ·Î¼¼½ºµé¿¡°Ô´Â ½Ã½ºÅÛ È£Ãâ msggetÀ¸·ÎºÎÅÍ ¿¡·¯°¡ µ¹¾Æ ¿Â´Ù. ±×·¯³ª ½Ã½ºÅÛ È£Ãâ get¿¡ ÀÇÇؼ ÀÌ·ç¾îÁö´Â ÀÌ·¯ÇÑ °Ë»çµéÀº º°·Î »ç¿ëµÇÁö ¾Ê´Â´Ù. Áï È£ÃâÀÚ°¡ ÀÚ½ÅÀÌ ¾î´À Çã°¡ ¹üÀ§ - ¼ÒÀ¯ÀÚ,Áý´Ü, ±âŸ - ¿¡ ¼ÓÇÏ´ÂÁö ¾Ë°í ÀÖÀ½À» ÀǹÌÇÑ´Ù. ¸¸¾à »ý¼ºÀÚ°¡ ƯÁ¤ Çã°¡ ºñÆ®¸¦ ²ô°í , È£ÃâÀÚ°¡ ÀÌ ºñÆ®¸¦ ÁöÁ¤ÇÏ°í ÀÖ´Ù¸é ½Ã½ºÅÛ È£Ãâ get¿¡ ÀÇÇØ ¿¡·¯°¡ °¨ÁöµÈ´Ù. ±×·¯³ª ¾î¶² ÇÁ·Î¼¼½ºµçÁö IPC ä³ÎÀÌ ÀÌ¹Ì Á¸ÀçÇÏ°í ÀÖÀ½À» ¾Ë°í ÀÖ´Ù¸é 0ÀÇ flag µ¶¸³º¯¼ö¸¦ ÁöÁ¤ÇØ ³õÀ½À¸·Î½á ÀÌ·¯ÇÑ °Ë»ç¸¦ ÀüÀûÀ¸·Î ÇÇÇÒ ¼ö ÀÖ´Ù. 2. ¸ðµç IPC ¿¬»êÀº ±× ¿¬»êÀ» »ç¿ëÇÏ´Â ÇÁ·Î¼¼½º¿¡ ´ëÇؼ Çã°¡ »çÇ× °Ë»ç¸¦ ÇÑ´Ù. ¿¹¸¦ µé¾î ÇÁ·Î¼¼½º°¡ ½Ã½ºÅÛ È£Ãâ msgsnd·Î ¼Ò½Ä ´ë·Õ¿¡ ¼Ò½ÄÀ» ³Ö°íÀÚ ÇÒ ¶§¸¶´Ù ÈÀÏ ½Ã½ºÅÛ Á¢±Ù¿¡¼ ¼öÇàÇÏ´Â °Í°ú °°Àº °Ë»ç¸¦ ÇÏ°Ô µÈ´Ù. . Ã¥ÀÓ »ç¿ëÀÚ´Â Ç×»ó Á¢±ÙÀÌ Çã°¡µÈ´Ù. . ¸¸¾à À¯È¿ »ç¿ëÀÚ ID°¡ ±× IPCä³Î¿¡ ´ëÇÑ uid°ª ¶Ç´Â cuid °ª°ú °°°í ±× IPCä³Î¿¡ ´ëÇÑ mode ³¹¸»ÀÌ ÀûÀýÇÑ Á¢±Ù Çã°¡ ºñÆ®¸¦ °®°í ÀÖ´Ù¸é, Á¢±ÙÀº Çã¿ëµÈ´Ù. "ÀûÀýÇÑ Á¢±ÙÇã°¡ ºñÆ®"¶ó ÇÔÀº, È£ÃâÀÚ°¡ IPCä³Î¿¡ Àб⠿¬»êÀÇ ¼öÇàÀ» ¿øÇÏ´Â °æ¿ì (¿¹¸¦ µé¾î ¼Ò½Ä ´ë·ÕÀ¸·ÎºÎÅÍ ¼Ò½ÄÀ» ¹Þ°í ½ÍÀ» ¶§)Àб⠺ñÆ®°¡ 1·Î µÇ¾î ÀÖ¾î¾ß ÇÏ°í, ¾²±â ¿¬»êÀ» À§Çؼ´Â ¾²±â ºñÆ®°¡ 1·Î µÇ¾î ÀÖ¾î¾ß ÇÔÀ» ÀǹÌÇÑ´Ù. . À¯È¿ Áý´Ü ID°¡ ±× IPCä³ÎÀÇ gid °ª ¶Ç´Â cgid°ª ÁßÀÇ Çϳª¿Í °°°í ÀûÀýÇÑ Á¢±Ù Çã°¡ ºñÆ®°¡ ±× IPCä³ÎÀÇ mode³¹¸»¿¡ Ç¥½ÃµÇ¾î ÀÖÀ¸¸é, Á¢±ÙÀÌ Çã°¡µÈ´Ù. . À§ÀÇ ¸ðµç °Ë»ç¿¡¼ '¼º°ø'ÀÌ ¾Æ´Ñ °æ¿ì¿¡´Â ÀûÀýÇÑ Çã°¡°¡ °¡´ÉÇÏ·Á¸é IPC ä³ÎÀÇ mode ³¹¸»³»ÀÇ ±âŸ Á¢±Ù Çã°¡ ºñÆ®°¡ 1À̾î¾ß¸¸ ÇÑ´Ù. ipc_perm ±¸Á¶¿¡¼´Â ¶ÇÇÑ È¨ »ç¿ë ÀÏ·Ã ¹øÈ£(slot usage sequence number)ÀÎ seq¶ó´Â À̸§ÀÇ º¯¼ö¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Ù.ÀÌ°ÍÀº ½Ã½ºÅÛ ³»¿¡¼ °¡´ÉÇÑ ¸ðµç IPCä³Î¿¡ ´ëÇØ ¾Ë¸ÍÀÌ°¡ À¯ÁöÇÏ´Â °è¼ö±âÀÌ´Ù. IPCä³ÎÀÌ ´ÝÈú ¶§¸¶´Ù ¾Ë¸ÍÀÌ´Â ÀÌ È¨ ¹øÈ£¸¦ Áõ°¡½ÃÅ°°í ÀÌ°ÍÀÌ ³ÑÄ¡¸é 0À¸·Î µ¹¾Æ°¡°Ô ÇÑ´Ù. ÀÌ °è¼ö±â°¡ ÇÊ¿äÇÑ ÀÌÀ¯´Â ¿©·¯°¡ÁöÀε¥ ¿ì¼± ¿¸° ÈÀÏ¿¡ ´ëÇØ ¾Ë¸ÍÀÌ°¡ À¯ÁöÇÏ´Â ÈÀÏ ÁöÁ¤ ¹øÈ£µéÀ» »ý°¢ÇØ º¸ÀÚ. À̵éÀº ÀÛÀº Á¤¼öÀÌ°í, ÇÑ ÇÁ·Î¼¼½º ³»¿¡¼¸¸ Àǹ̸¦ °¡Áö¹Ç·Î , À̵éÀº ÇÁ·Î¼¼½º¿¡ ÇÑÁ¤µÈ ¹øÈ£ÀÌ´Ù. ¿¹¸¦ µé¾î ¾î¶² ÇÁ·Î¼¼½º¿¡¼ ÈÀÏ ÁöÁ¤ ¹øÈ£ 4·ÎºÎÅÍ Àб⸦ ¿øÇÑ´Ù¸é ÀÌ ¿¬»êÀº ±× ÇÁ·Î¼¼½º°¡ ÀÌ ÈÀÏ ÁöÁ¤ ¹øÈ£·Î ¿¾î ³õÀº ÈÀÏÀÌ ÀÖ´Â °æ¿ì¿¡¸¸ Çã¿ëµÈ´Ù. ´Ù¸¥ ¹«°üÇÑ ÇÁ·Î¼¼½º°¡ ÈÀÏ ÁöÁ¤ ¹øÈ£4·Î ¿¾î ³õÀº ÈÀÏ¿¡ ´ëÇؼ´Â ¾Æ¹«·± ¿µÇâµµ ¹ÌÄ¡Áö ¸øÇÑ´Ù. ±×·¯³ª IPC ä³ÎÀº Àü½Ã½ºÅÛÀû(systemwide)ÀÌ°í ƯÁ¤ ÇÁ·Î¼¼½º¿¡ ÇÑÁ¤µÈ °ÍÀÌ ¾Æ´Ï´Ù. ½Ã½ºÅÛ È£Ãâ get(msgget,semget,shmget)ÁßÀÇ Çϳª·ÎºÎÅÍ(ÈÀÏ ÁöÁ¤¹øÈ£¿Í ºñ½ÁÇÑ)IPC ½Äº°ÀÚ¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ±×·¯³ª, Á¤¼öÇüÀÎ ÀÌ ½Äº°ÀÚµéÀº ½Ã½ºÅÛ ³»ÀÇ ¸ðµç ÇÁ·Î¼¼½ºµé¿¡ ´ëÇؼ Àǹ̸¦ °®´Â´Ù. ¿¹¸¦ µé¾î °í°´°ú ÀÏ²Û °°ÀÌ ¼·Î ¿¬°èµÇ¾î ÀÖÁö ¾ÊÀº µÎ ÇÁ·Î¼¼½º°¡ ÇϳªÀÇ ¼Ò½Ä ´ë·ÕÀ» »ç¿ëÇÒ ¶§¿¡ ½Ã½ºÅÛ È£Ãâ msgget¿¡¼ µ¹¾Æ¿À´Â ¼Ò½Ä ´ë·Õ ½Äº°ÀÚ´Â µÎ ÇÁ·Î¼¼½º¿¡¼ °°Àº Á¤¼ö°ªÀ» °®´Â´Ù. ÀÌ°ÍÀº ÇöÀç ±âŸ-Àбâ Á¢±ÙÀÌ Çã°¡µÈ ä »ç¿ëÁßÀÎ ¼Ò½Ä´ë·Õ¿¡ ´ëÇؼ, ºñÇÕ¸®ÀûÀÎ ÇÁ·Î¼¼½ºµéÀÌ ÀÛÀº Á¤¼öÇü ½Äº°ÀÚ¸¦ »ç¿ëÇÏ¿© ¼Ò½ÄÀ» ÀÐÀ» ¼öµµ ÀÖÀ½À» ÀǹÌÇÑ´Ù. ÀÌ·¯ÇÑ ½Äº°Àڵ鿡 ´ëÇؼ »ç¿ë °¡´ÉÇÑ °ªµéÀÌ ÈÀÏ ÁöÁ¤ ¹øÈ£µéó·³ ÀÛÀº °ªµéÀ̶ó¸é ÇØ´ç ½Äº°ÀÚ¸¦ ¹ß°ßÇÒ È®·üÀÌ 1/50Á¤µµ°¡ µÉ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ÀáÀçÀûÀÎ ¹®Á¦¸¦ ÇÇÇϱâÀ§ÇØ System V IPC±â´ÉÀÇ ¼³°èÀÚµéÀº ½Äº°ÀÚ °ªÀÇ °¡´ÉÇÑ ¹üÀ§¸¦ ÀÛÀº Á¤¼ö°¡ ¾Æ´Ï¶ó ¸ðµç Á¤¼ö¸¦ Æ÷ÇÔÇϵµ·Ï È®Àå½ÃÄ×´Ù. ÀÌ°ÍÀº IPC Å×À̺í Ç׸ñÀÌ ´Ù½Ã »ç¿ëµÉ ¶§¸¶´Ù È£Ãâ ÇÁ·Î¼¼½º·Î µ¹¾Æ¿À´Â ½Äº°ÀÚ °ªÀ» IPCÇ¥ Ç׸ñ ¼ö¸¸Å Áõ°¡½ÃÅ´À¸·Î½á ±¸ÇöÇÑ´Ù. ¿¹¸¦ µé¾î ¸¸¾à ½Ã½ºÅÛÀÌ ÃÖ´ë 50°³ÀÇ ¼Ò½Ä´ë·ÕÀ» °¡Áú¼ö ÀÖµµ·Ï ±¸¼ºµÇ¾î ÀÖ´Ù¸é óÀ½¿¡´Â ¾Ë¸ÍÀÌÀÇ Ã¹¹ø° ¼Ò½Ä ´ë·Õ Ç¥ Ç׸ñÀÌ »ç¿ëµÇ°í , ±× ÇÁ·Î¼¼½º·Î µ¹¾Æ¿À´Â ½Äº°ÀÚ °ªÀº 0ÀÌ´Ù. ÀÌ ¼Ò½Ä ´ë·ÕÀÌ Á¦°ÅµÈÈÄ ÀÌ Ã¹¹ø° Ç¥ Ç׸ñÀ» ´Ù½Ã »ç¿ëÇÏ¸é µ¹¾Æ ¿À´Â ½Äº°ÀÚ´Â 50ÀÌ´Ù. ±× ÈÄ¿¡´Â ½Äº°ÀÚ°¡ 100ÀÌ µÇ°í, °è¼Ó ÀÌ·± ½ÄÀ¸·Î Áõ°¡ÇÑ´Ù. seq´Â unsigned short Á¤¼öÇüÀ̹ǷΠÀÌ seq´Â Å×ÀÌºí ¿£Æ®¸®°¡ 65,535¹ø »ç¿ëµÈ ÈÄ ¼øȯÀ» Çü¼ºÇÑ´Ù. ÀÌ·¯ÇÑ À¯ÇüÀÇ ¿¹·Î ´ÙÀ½ ÇÁ·Î±×·¥À» »ìÆ캸¸é ÀÌ ÇÁ·Î±×·¥Àº msgget¿¡¼ µ¹¾Æ¿À´Â óÀ½ 10°³ÀÇ ½Äº°ÀÚ°ªÀ» ÀμâÇÑ´Ù. include #include #include #define KEY ((key_t) 98765L) #define PERMS 0666 main() { int i,msqid; for (i=0;i<10;i++) { if ((msqid=msgget(KEY,PERMS|IPC_CREAT)) < 0) printf("cat't create message queue\n"); printf("msqid = %d\n",msqid); if (msgctl(msqid,IPC_RMID, (struct msqid_ds *) 0)<0) printf("can't remove message queue"); } } # a.out msqid =0 msqid =50 msqid =100 msqid =150 msqid =200 msqid =250 msqid =300 msqid =350 msqid =400 msqid =450 o ¼Ò½Ä ´ë·Õ - ÇÁ·Î¼¼½ºµé°£ÀÇ ¼Ò½Ä Àü´ÞÀÇ ¸î°¡Áö ÇüÅ´ ÇöÀç ¸¹Àº ¿î¿µÃ¼Á¦ÀÇ ÀϺκÐÀÌ µÇ¾ú´Ù. ¸î¸î ¿î¿µÃ¼Á¦¿¡¼´Â ÇÑ ÇÁ·Î¼¼½º°¡ ´Ù¸¥ ƯÁ¤ÇÑ ÇÁ·Î¼¼½º¿¡°Ô¸¸ ¼Ò½ÄÀ» º¸³¾ ¼ö ÀÖµµ·Ï ¼Ò½Ä Àü´ÞÀ» Á¦¾îÇÑ´Ù. ±×·¯³ª System V¿¡´Â ÀÌ·¯ÇÑ Á¦ÇÑÀÌ ¾ø´Ù. System VÀÇ ¼Ò½Ä ±¸Çö¿¡¼´Â ¸ðµç ¼Ò½ÄÀº ¾Ë¸ÍÀÌ ¼Ó¿¡ ÀúÀåµÇ¸ç, ÀÌ¿Í °ü·ÃµÈ ¼Ò½Ä ´ë·Õ ½Äº°ÀÚ (message queue identifier)¸¦ °¡Áø´Ù. ÀÌ ½Äº°ÀÚ¸¦ msqid¶ó ºÎ¸£¸ç ¼Ò½ÄÀÇ Æ¯Á¤ÇÑ ´ë·ÕÀ» °¡¸®Å²´Ù. ÇÁ·Î¼¼½ºµéÀº ÀÓÀÇÀÇ ´ë·Õ¿¡ ¼Ò½ÄÀ» ÀÐ°í ¾µ ¼ö ÀÖ´Ù. ¾î¶² ÇÁ·Î¼¼½º°¡ ´ë·Õ¿¡ ¼Ò½ÄÀ» ¾²±âÀü¿¡ ÀÌ ¼Ò½ÄÀÌ µµÂøÇϱ⸦ ±â´Ù¸®´Â ÇÁ·Î¼¼½º°¡ Á¸ÀçÇØ¾ß ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ÀÌ·¯ÇÑ Á¡Àº ÆÄÀÌÇÁ³ª FIFO¿Í´Â ´ëÁ¶ÀûÀ̶ó ÇÒ ¼ö Àִµ¥, ÀÌ·¯ÇÑ °ÍµéÀº Àд ÇÁ·Î¼¼½º°¡ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì¿¡´Â ¾²´Â ÇÁ·Î¼¼½º´Â Àǹ̰¡ ¾ø±â ¶§¹®ÀÌ´Ù. ¾î¶² ÇÁ·Î¼¼½º°¡ ´ë·Õ¿¡ ¸î°¡Áö ¼Ò½ÄÀ» ¾²°í ³ ÈÄ¿¡ Á¾·áÇØ ¹ö¸®°í, ³ªÁß¿¡ ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ±× ¼Ò½ÄÀ» Àд °ÍÀÌ °¡´ÉÇÏ´Ù. ´ë·Õ³»ÀÇ ¸ðµç ¼Ò½ÄÀº ´ÙÀ½°ú °°Àº ¼Ó¼ºÀ» °¡Áø´Ù. . ±äÁ¤¼öÇü(long integertype) . ¼Ò½ÄÁßÀÇ µ¥ÀÌŸ ºÎºÐÀÇ ±æÀÌ(0ÀÌ µÉ¼öµµ ÀÖÀ½) . µ¥ÀÌŸ(¸¸¾à ±æÀÌ°¡ 0º¸´Ù Å©´Ù¸é) ½Ã½ºÅÛ³»ÀÇ °¢ ¼Ò½Ä ´ë·Õ¿¡ ´ëÇؼ ¾Ë¸ÍÀÌ´Â ´ÙÀ½°ú °°Àº Á¤º¸ ±¸Á¶¸¦ À¯ÁöÇÑ´Ù. #include #include struct msqid_ds { struct ipc_perm msg_perm; /* operation permission struct */ struct msg *msg_first; /* ptr to first message on q */ struct msg *msg_last; /* ptr to last message on q */ ushort msg_cbytes; /* current # bytes on q */ ushort msg_qnum; /* # of messages on q */ ushort msg_qbytes; /* max # of bytes on q */ ushort msg_lspid; /* pid of last msgsnd */ ushort msg_lrpid; /* pid of last msgrcv */ time_t msg_stime; /* last msgsnd time */ time_t msg_rtime; /* last msgrcv time */ time_t msg_ctime; /* last change time */ }; ipc_permÀº ƯÁ¤ÇÑ ¼Ò½Ä ´ë·Õ¿¡ ´ëÇÑ Á¢±Ù Çã°¡ »çÇ×µéÀ» °¡Áö°í ÀÖ´Ù. msg ±¸Á¶´Â ¾Ë¸ÍÀÌ¿¡ ÀÇÇØ »ç¿ëµÇ´Â ³»ºÎ µ¥ÀÌŸ ±¸Á¶·Î¼ ƯÁ¤ÇÑ ´ë·Õ¿¡ ´ëÇØ ¼Ò½ÄµéÀÇ ¿¬°á ¸ñ·Ï(linked list)À» À¯ÁöÇÑ´Ù. page 123 ±×¸² 3.15 ÂüÁ¶ ±×¸²Ã³·³ ¾Ë¸ÍÀÌ ¼ÓÀÇ Æ¯Á¤ ¼Ò½Ä ´ë·ÕÀ» ¼Ò½ÄµéÀÇ ¿¬°á ¸ñ·ÏÀ¸·Î¼ ±×¸± ¼ö ÀÖ´Ù. ´ë·Õ¿¡´Â °¢°¢ÀÇ ±æÀÌ°¡ 1,2,±×¸®°í 3¹ÙÀÌÆ®ÀÎ 3°³ÀÇ ¼Ò½ÄÀÌ ÀÖ°í ¼Ò½ÄµéÀÌ ¿°ÅµÈ ¼ø¼´ë·Î ¾²¿©Áø´Ù°í ÇÏÀÚ. ¶Ç , ÀÌ·¯ÇÑ ¼¼°³ÀÇ ¼Ò½ÄµéÀº °¢°¢ 100,200,±×¸®°í 300ÀÇ typeÀ» °®°í ÀÖ´Ù°í °¡Á¤ÇÑ´Ù. msgget ½Ã½ºÅÛ È£Ãâ·Î »õ·Î¿î ¼Ò½Ä ´ë·ÕÀ» ¸¸µé°Å³ª ±âÁ¸ÀÇ ¼Ò½Ä ´ë·Î¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. #include #include #include int msgget(key_t key, int msgflag); msgflagÀÇ °ªÀº ´ÙÀ½¿¡ ÀÖ´Â »ó¼öµéÀÇ Á¶ÇÕÀÌ µÈ´Ù. ------------------------------------------------------- | Numeric | Symbolic | Description | ------------------------------------------------------- | 0400 | MSG_R | Read by owner | | 0200 | MSG_W | Write by owner | | 0040 | MSG_R >> 3 | Read by group | | 0020 | MSG_W >> 3 | Write by group | | 0004 | MSG_R >> 6 | Read by world | | 0002 | MSG_W >> 6 | Write by world | | | IPC_CREAT | ¾ÕÀå ÂüÁ¶ | | | IPC_EXCL | ¾ÕÀå ÂüÁ¶ | ------------------------------------------------------- msgget¿¡ µ¹¾Æ¿À´Â °ªÀº ¼Ò½Ä ´ë·Õ ½Äº°ÀÚÀÎ msqidÀÌÁö¸¸, ¸¸¾à ¿¡·¯°¡ ¹ß»ýÇß´Ù¸é -1 °ªÀÌ µ¹¾Æ¿Â´Ù. msggetÀ¸·Î ¼Ò½Ä ´ë·ÕÀ» Çѹø ¿¸é, msgsnd ½Ã½ºÅÛ È£ÃâÀ» »ç¿ëÇÏ¿© ´ë·Õ¿¡ ¼Ò½Ä Çϳª¸¦ ³ÖÀ» ¼ö ÀÖ´Ù. #include #include #include int msgsnd(int msqid, struct msgbuf *ptr, int length, int flag ); µ¶¸³º¯¼ö prtÀº ´ÙÀ½°ú °°Àº ¸ð¾çÀ» °®´Â ±¸Á¶¿¡ ´ëÇÑ Áö½ÃÀÚÀÌ´Ù.(ÀÌ°ÍÀº ¿¡ Á¤ÀǵǾî ÀÖ´Ù.) struct msgbuf { long mtype; /* message type, must be > 0 */ char mtext[1]; /* message data */ mtext´Â ¼Ò½ÄÀÇ µ¥ÀÌŸ ºÎºÐÀÌ´Ù. ÀÌ ºÎºÐÀº ¹®ÀÚ¸¸À» À§ÇÑ °ÍÀÌ ¾Æ´Ï¹Ç·Î À̸§ÀÌ À߸øµÇ¾ú´Ù. µ¥ÀÌŸÀÇ ÇüÅ·δ ÀÌÁø µ¥ÀÌŸ³ª ¹®ÀÚ ¾î´À °ÍÀ̳ª °¡´ÉÇÏ´Ù. 0ÀÇ ¼Ò½ÄÇüÀº msgrcv ½Ã½ºÅÛÈ£Ãâ¿¡¼ Ưº°ÇÑ Ç¥½ÄÀ¸·Î »ç¿ëµÇ¹Ç·Î ¼Ò½Ä ÇüÀº 0º¸´Ù Ä¿¾ß ÇÑ´Ù. msgsndÀÇ length µ¶¸³ º¯¼ö´Â ¹ÙÀÌÆ® ´ÜÀ§·Î ¼Ò½ÄÀÇ ±æÀ̸¦ ³ªÅ¸³½´Ù. ÀÌ°ÍÀº long integer ¼Ò½ÄÇü µÚ¿¡ ¿À´Â »ç¿ëÀÚ Á¤ÀÇ µ¥ÀÌŸÀÇ ±æÀÌ´Ù. ÀÌ ±æÀÌ´Â 0ÀÌ µÉ ¼ö ÀÖ´Ù. flag µ¶¸³ º¯¼ö´Â IPC_NOWAIT³ª 0À¸·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. IPC_NOWAIT°ªÀº ¼Ò½Ä ´ë·Õ¿¡ »õ·Î¿î ¼Ò½ÄÀ» À§ÇÑ ¿©À¯ °ø°£ÀÌ ¾øÀ» °æ¿ì Áï½Ã ½Ã½ºÅÛ È£Ãâ¿¡¼ µ¹¾Æ¿Àµµ·Ï ÇÑ´Ù. ÀÌ·¯ÇÑ »óÇ×Àº ƯÁ¤ÇÑ ´ë·Õ¿¡ ³Ê¹« ¸¹Àº ¼Ò½ÄÀÌ Àְųª ½Ã½ºÅÛ Àüü¿¡ ³Ê¹« ¸¹Àº ¼Ò½ÄÀÌ ÀÖÀ» °æ¿ì¿¡ ÀϾÙ. ¸¸¾à¿¡ ¼Ò½ÄÀ» À§ÇØ ÇÊ¿äÇÑ °ø°£ÀÌ ¾ø°í IPC_NOWAIT°¡ ¸í½ÃµÇ¾î ÀÖ´Ù¸é msgsnd´Â -1À» µ¹·ÁÁÖ°í errno´Â EAGAINÀ» °®°Ô µÈ´Ù. ¸¸¾à ½Ã½ºÅÛ È£ÃâÀÌ ¼º°øÇÑ´Ù¸é msgsnd´Â 0À» µ¹·Á ÁØ´Ù. msgrcv ½Ã½ºÅÛ È£ÃâÀ» »ç¿ëÇÏ¿© ¼Ò½Ä ´ë·Õ¿¡¼ ¼Ò½ÄÀ» ÀÐÀ» ¼ö ÀÖ´Ù. #include #include #include int msgrcv(int msqid, struct msgbuf *ptr, int length, long msgtype, int flag); ptr µ¶¸³ º¯¼ö´Â msgsnd¿¡¼¿Í ºñ½ÁÇÏ¸ç ¹ÞÀº ¼Ò½ÄÀ» ÀúÀåÇÒ Àå¼Ò¸¦ ¸í½ÃÇÑ´Ù. len´Â ptrÀÌ Áö½ÃÇÏ´Â ±¸Á¶ÀÇ µ¥ÀÌŸ ºÎºÐÀÇ Å©±â¸¦ ¸í½ÃÇÑ´Ù. ÀÌ°ÍÀº ½Ã½ºÅÛ È£Ãâ¿¡¼ º¹±ÍÇÏ´Â µ¥ÀÌŸÀÇ ÃÖ´ë¾çÀÌ´Ù. ¸¸¾à flag µ¶¸³ º¯¼ö¿¡¼ MSG_NOERROR ºñÆ®°¡ ¼³Á¤µÇ¸é ÀÌ°ÍÀº ¹ÞÀº ¼Ò½ÄÀÇ ½ÇÁ¦ µ¥ÀÌŸ ºÎºÐÀÌ lengthº¸´Ù Å©´Ù¸é Áï½Ã µ¥ÀÌŸ ºÎºÐÀ» ÀÚ¸£°í ¿¡·¯¾øÀÌ º¹±ÍÇÑ´Ù´Â °ÍÀ» ³ªÅ¸³½´Ù. ¹Ý´ë·Î MSG_NOERRORÇ¥½Ã±â¸¦ ¸í½ÃÇÏÁö ¾Ê°í length°¡ Àüü ¼Ò½ÄÀ» ¹ÞÀ» ¼ö ÀÖÀ» Á¤µµ·Î ÃæºÐÈ÷ Å©Áö ¾Ê´Ù¸é ¿¡·¯°¡ ÀϾ´Â ¿øÀÎÀÌ µÈ´Ù. ±äÁ¤¼öÀÎ msgtype µ¶¸³º¯¼ö´Â ´ë·ÕÀ¸·ÎºÎÅÍ ¾î¶² ¼Ò½ÄÀ» ¿ä±¸ÇÏ´ÂÁö¸¦ ¸í½ÃÇÑ´Ù. . msgtypeÀÌ 0À̶ó¸é, ´ë·ÕÀÇ Ã¹¹ø° ¼Ò½ÄÀ» ¹Þ´Â´Ù. °¢ ¼Ò½Ä ´ë·ÕÀº ¸ÕÀú µé¾î¿À´Â °ÍÀÌ ¸ÕÀú ³ª°¡µµ·Ï À¯ÁöµÇ¹Ç·Î msgtypeÀÌ 0À̶ó´Â °ÍÀº ´ë·Õ¿¡¼ °¡Àå ¿À·¡µÈ ¼Ò½ÄÀÌ ÁÖ¾îÁø´Ù´Â °ÍÀ» ¶æÇÑ´Ù. . msgtypeÀÌ 0º¸´Ù Å©´Ù¸é, msgtype°ú µ¿ÀÏÇÑ ÇüÀ» °®´Â ù¹ø° ¼Ò½ÄÀ» ¹Þ´Â´Ù. . msgtypeÀÌ 0º¸´Ù ÀÛ´Ù¸é, msgtypeÀÇ Àý´ëÄ¡º¸´Ù °°°Å³ª ÀÛÀº ÇüÁß¿¡¼ °¡Àå ÀÛÀº ÇüÀ» °®´Â ù¹ø° ¼Ò½ÄÀ» ¹Þ´Â´Ù. msgtypeÀÇ ¿©·¯°¡Áö °ª¿¡ ´ëÇØ ¹ÞÀ» ¼Ò½ÄÀ» º¸¿©ÁØ´Ù. ------------------------------------------ | msgtype | Type of message returned | ------------------------------------------ | 0L | 100 | | 100L | 100 | | 200L | 200 | | 300L | 300 | | -100L | 100 | | -200L | 100 | | -300L | 100 | ------------------------------------------ flag µ¶¸³ º¯¼ö´Â ¿ä±¸µÈ ÇüÀÇ ¼Ò½ÄÀÌ ´ë·Õ¿¡ ¾øÀ» °æ¿ì¿¡ ¾î¶»°Ô ÇÒ °ÍÀÎÁö¸¦ ¸í½ÃÇÑ´Ù. ¸¸¾à IPC_NOWAITºñÆ®°¡ ¼³Á¤µÇ¾ú´Ù¸é, msgrcv ½Ã½ºÅÛ È£ÃâÀº ¼Ò½ÄÀÌ ¾øÀ» °æ¿ì¿¡ Áï½Ã µ¹¾Æ¿Â´Ù. ÀÌ °æ¿ì¿¡ ½Ã½ºÅÛ È£ÃâÀº errno¸¦ ENOMSG·Î ¼³Á¤ÇÏ°í -1À» µ¹·Á ÁØ´Ù. ±×·¸Áö ¾Ê´Ù¸é, È£ÃâÇÑ ÇÁ·Î¼¼½º´Â ´ÙÀ½ÁßÀÇ ¾î¶² Çϳª°¡ ÀϾ ¶§±îÁö Áö¿¬µÈ´Ù. . ¿ä±¸µÈ ÇüÀÇ ¼Ò½ÄÀÌ µµÂøÇÑ´Ù. . ¼Ò½Ä ´ë·ÕÀÌ ½Ã½ºÅÛ¿¡¼ Á¦°ÅµÈ´Ù. . ÇÁ·Î¼¼½º°¡ ½ÅÈ£¸¦ ¹Þ¾Æ Æ÷ÂøÇÑ´Ù. msgrcv´Â ¼º°øÀûÀΠȣÃâ¿¡ ´ëÇؼ´Â ¹ÞÀº ¼Ò½ÄÀÇ µ¥ÀÌŸ ¹ÙÀÌÆ® ¼ö¸¦ µ¹·ÁÁØ´Ù. ÀÌ°ÍÀº ptrµ¶¸³ º¯¼ö¸¦ ÅëÇØ º¹±ÍÇÏ´Â ¼Ò½ÄÀÇ Å©±â(long integer)¸¦ Æ÷ÇÔÇÏÁö ¾Ê´Â´Ù. msgctl ½Ã½ºÅÛ È£ÃâÀº ¼Ò½Ä ´ë·Õ¿¡ ´ëÇÑ ´Ù¾çÇÑ Á¦¾î ±â´ÉÀ» Á¦°øÇÑ´Ù. #include #include #include int msgctl(int msqid, int cmd, struct msqid_ds *buff); IPC_RMID¸¦ °®´Â cmd´Â ´ÜÁö ½Ã½ºÅÛ¿¡¼ ¼Ò½Ä ´ë·ÕÀ» Á¦°ÅÇÏ´Â °ÍÀ¸·Î ¿©±â¼´Â À̰͸¸ »ç¿ëÇÑ´Ù. o °øÀ¯ ±â¾ï Àå¼Ò (Shared Memory) - °í°´-ÀÏ²Û ÈÀÏ º¹Á¦ ÇÁ·Î±×·¥¿¡ »ç¿ëµÇ´Â Åë»óÀûÀÎ ¸î°¡Áö ´Ü°è¸¦ °í·ÁÇØ º¸ÀÚ. . ÀϲÛÀÌ ÀÔ·Â ÈÀÏ¿¡¼ Àд´Ù. ÀÌ·¯ÇÑ µ¿ÀÛÀº º¸Åë ¾Ë¸ÍÀÌ°¡ µ¥ÀÌŸ¸¦ ÀÚ½ÅÀÇ ³»ºÎ µ¢ÀÌ ¿ÏÃ濵¿ª (block buffer)ÁßÀÇ Çϳª·Î ÀоîµéÀÌ°í ÀÌ°ÍÀ» ÀϲÛÀÇ ¿ÏÃæ ¿µ¿ª(½Ã½ºÅÛ È£Ãâ readÀÇ µÎ¹ø° µ¶¸³ º¯¼ö) À¸·Î º¹Á¦ÇÏ´Â µÎ°¡Áö µ¿ÀÛÀ¸·Î ÀÌ·ç¾îÁø´Ù. ´ëºÎºÐÀÇ À¯´Ð½º ½Ã½ºÅÛÀº Àϲۿ¡ ÀÇÇØ ÇàÇØÁö´Â °Í°ú °°Àº ¼øÂ÷ Àб⸦ °¨ÁöÇϸé, read ¿ä±¸¿¡ ¾Õ¼ Çѵ¢À̸¦ ¹Ì¸® ÀÐÀ¸·Á°í ÇÑ´Ù. ÀÌ°ÍÀ» ÈÀÏÀ» º¹Á¦Çϴµ¥ °É¸®´Â ½Ã°£À» ´ÜÃà½ÃÅ°Áö¸¸ ¸ðµç read¿¡ ´ëÇÑ µ¥ÀÌŸ°¡ ¾Ë¸ÍÀÌ¿¡ ÀÇÇØ µ¢ÀÌ ¿ÏÃæ ¿µ¿ª¿¡¼ È£ÃâÇÑ ÇÁ·Î¼¼½ºÀÇ ¿ÏÃæ ¿µ¿ªÀ¸·Î º¹Á¦µÇ´Â °Í°ú °ü°è°¡ ¾ø´Ù. . ÀϲÛÀº ÀÌ Àå¿¡¼ ¼³¸íµÈ ÆÄÀÌÇÁ, FIFO, ¼Ò½Ä ´ë·ÕµîÀÇ ±â¹ýÁß¿¡ Çϳª¸¦ »ç¿ëÇÏ¿© ÀÌ·¯ÇÑ µ¥ÀÌŸ¸¦ ¼Ò½Ä ¾È¿¡ ¾µ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ¼¼°¡Áö IPC ÇüÅÂÀÇ ¾î´Â °ÍÀ̳ª µ¥ÀÌŸ°¡ »ç¿ëÀÚÀÇ ¿ÏÃæ ¿µ¿ª¿¡¼ ¾Ë¸ÍÀÌ·Î º¹Á¦µÇ¾î¾ß ÇÑ´Ù. . °í°´Àº IPCä³Î¿¡¼ µ¥ÀÌŸ¸¦ Àдµ¥ À̶§, ´Ù½Ã µ¥ÀÌŸ¸¦ ¾Ë¸ÍÀÌÀÇ IPC ¿ÏÃæ ¿µ¿ª¿¡¼ °í°´ÀÇ ¿ÏÃæ ¿µ¿ªÀ¸·Î º¹Á¦ÇÏ¿©¾ß ÇÑ´Ù. . ¸¶Áö¸·À¸·Î µ¥ÀÌŸ´Â ½Ã½ºÅÛ È£Ãâ writeÀÇ µÎ¹ø° µ¶¸³ º¯¼öÀÎ °í°´ÀÇ ¿ÏÃæ ¿µ¿ª¿¡¼ Ãâ·ÂÈÀÏ·Î º¹Á¦µÈ´Ù. ÀÌ ½Ã½ºÅÛ È£ÃâÀº µ¥ÀÌŸ¸¦ ¹Ù·Î ¾Ë¸ÍÀÌ ¿ÏÃæ ¿µ¿ªÀ¸·Î º¹Á¦ÇÏ°í º¹±ÍÇϸç, ÀÌÈÄ ¾Æ¹«¶§³ª ¾Ë¸ÍÀÌ´Â ±â±â¿¡ ½ÇÁ¦ÀûÀÎ ¾²±â¸¦ ÇÑ´Ù. ÀüüÀûÀ¸·Î µ¥ÀÌŸ¸¦ ³×¹ø º¹Á¦ÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ·¯ÇÑ ³×¹øÀÇ º¹Á¦´Â ¾Ë¸ÍÀÌ¿Í »ç¿ëÀÚ ÇÁ·Î¼¼½º°£¿¡¼ ÇàÇØÁø´Ù. ÀÌ·¯ÇÑ º¹Á¦¸¦ ¹®¸Æ°£ º¹Á¦(intercontext copy)¶ó°í ÇÑ´Ù. ´ëºÎºÐÀÇ À¯´Ð½º ±¸Çö¿¡´Â °¡´ÉÇÑÇÑ º¹Á¦¸¦ ºü¸£°Ô ÇÏ°íÀÚ ÇÏÁö¸¸ ¿©ÀüÈ÷ ¸¹Àº ºñ¿ëÀÌ ¿ä±¸µÈ´Ù. ´ÙÀ½Àº µÎ ÇÁ·Î¼¼½º»çÀÌ¿¡¼ ÀÌ·¯ÇÑ µ¥ÀÌŸÀÇ À̵¿À» ±×¸²À¸·Î º¸¿©ÁØ´Ù. --------------- --------------- | client | | server | --------------- --------------- \ ¢Ø / ¢Ö \ \ / / \ ---------------------------------- \| \ ----------------- / / | |\ \ | FIFO, pipe | / / | output | \ -- | or message |<- ---|-------- input file <-----------|-- ----------------- | file ----------------------------------- kernel < °í°´°ú ÀϲۻçÀÌ¿¡¼ÀÇ ÀüÇüÀûÀÎ µ¥ÀÌŸ À̵¿ > ÀÌ·¯ÇÑ IPCÇüÅÂ(ÆÄÀÌÇÁ, FIFO, ¼Ò½Ä´ë·Õ)¿Í °ü·ÃµÈ ¹®Á¦´Â µÎ ÇÁ·Î¼¼½º°¡ Á¤º¸¸¦ ±³È¯Çϱâ À§Çؼ Á¤º¸°¡ ¾Ë¸ÍÀ̸¦ °ÅÃÄ°¡¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. °øÀ¯ ±â¾ï Àå¼Ò´Â µÎ°³ ÀÌ»óÀÇ ÇÁ·Î¼¼½º°¡ ±â¾ï Àå¼Ò Á¶°¢À» °øÀ¯Çϵµ·Ï Çؼ ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇØ ÁØ´Ù. ¹°·Ð ´Ù¼öÀÇ ÇÁ·Î¼¼½º°¡ ±â¾ï Àå¼ÒÀÇ ÀϺθ¦ °øÀ¯Çϱâ À§Çؼ´Â ´Ù¼öÀÇ ÇÁ·Î¼¼½ºµéÀÌ ±×µé »çÀÌ¿¡¼ ±â¾ï Àå¼ÒÀÇ »ç¿ë¿¡ ´ëÇØ ÇùÁ¶ÇØ¾ß ÇÏ´Â ¹®Á¦°¡ ÀÖ´Ù. (±â¾ï Àå¼ÒÀÇ ÀϺκÐÀ» °øÀ¯ÇÏ´Â °ÍÀº ÈÀÏ Àá±Ý ¿¹¿¡¼ »ç¿ëµÇ¾ú´ø ¼øÂ÷ ¹øÈ£ ÈÀÏó·³ µð½ºÅ© ÈÀÏÀ» °øÀ¯ÇÏ´Â °Í°ú ºñ½ÁÇÏ´Ù) ¿¹¸¦ µé¸é , ÇÑ ÇÁ·Î¼¼½º°¡ °øÀ¯ ±â¾ï Àå¼Ò¸¦ Àд´ٸé , ´Ù¸¥ ÇÁ·Î¼¼½º´Â µ¥ÀÌŸ¸¦ ó¸®Çϱâ Àü¿¡ ÀбⰡ ³¡³ª±â¸¦ ±â´Ù·Á¾ß ÇÑ´Ù. ´ÙÇàÈ÷µµ, ÀÌ°ÍÀº ÀÌ°ÍÀº µ¿±âȸ¦ À§ÇÑ Â÷´Ü Ç¥½Ã±â¸¦ »ç¿ëÇÏ¸é ½±°Ô ÇØ°áÇÒ ¼ö ÀÖ´Ù. ÀÌÁ¦ °í°´-ÀÏ²Û ¿¹¿¡¼ÀÇ ´Ü°èµéÀº ´ÙÀ½°ú °°ÀÌ µÈ´Ù. . ÀϲÛÀº Â÷´Ü Ç¥½Ã±â¸¦ »ç¿ëÇÏ¿© °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢À¸·Î Á¢±ÙÇÑ´Ù. . ÀϲÛÀº ÀÔ·Â ÈÀÏÀ» °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢À¸·Î ÀоîµéÀδÙ. ÀоîµéÀÏ ÁÖ¼Ò(½Ã½ºÅÛ È£Ãâ readÀÇ µÎ¹ø° µ¶¸³ º¯¼ö)´Â °øÀ¯ ±â¾ï Àå¼Ò¸¦ °¡¸®Å²´Ù. . ÀбⰡ ¿Ï·áµÇ¸é ÀϲÛÀº ´Ù½Ã Â÷´Ü Ç¥½Ã±â¸¦ »ç¿ëÇÏ¿© °í°´¿¡°Ô ¾Ë¸°´Ù. . °í°´Àº °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢¿¡¼ Ãâ·Â ÈÀÏ·Î µ¥ÀÌŸ¸¦ ¾´´Ù. ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ -------------------- ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ ¦ client ¦<---> | shared memory |<---> ¦ server ¦ ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ -------------------- ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ / ¢Ø / \ ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ output ¦ / \ ¦ input file <------¦------- ------¦----- file ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ kernel < °øÀ¯ ±â¾ï Àå¼Ò¸¦ ÀÌ¿ëÇÑ °í°´°ú Àϲ۰£ÀÇ µ¥ÀÌŸ À̵¿ > ÀÌ ±×¸²¿¡¼ µ¥ÀÌŸ´Â ´ÜÁö µÎ¹ø¸¸ º¹Á¦µÇ¸é µÈ´Ù. Áï, ÀÔ·Â ÈÀÏ¿¡¼ °øÀ¯ ±â¾ï Àå¼Ò·Î ±×¸®°í °øÀ¯ ±â¾ï Àå¼Ò¿¡¼ Ãâ·Â ÈÀÏ·Î º¹Á¦µÈ´Ù. ÀÌ·¯ÇÑ µÎ¹øÀÇ º¹Á¦´Â ¾Õ¿¡¼ ¾ð±ÞµÈ °Íó·³ ¾Ë¸ÍÀÌÀÇ µ¢ÀÌ ¿ÏÃæ ¿µ¿ªµµ Æ÷ÇԵȴÙ. ¸ðµç °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢¿¡ ´ëÇؼ ¾Ë¸ÍÀÌ´Â ´ÙÀ½°ú °°Àº Á¤º¸ ±¸Á¶¸¦ À¯ÁöÇÑ´Ù. #include #include struct shmid_ds { struct ipc_perm shm_perm; /* operation permission struct */ uint shm_segsz; /* size of segment in bytes */ struct XXX shm_YYY; /* implementation dependent info */ ushort shm_lpid; /* pid of last shmop */ ushort shm_cpid; /* pid of creator */ ushort shm_nattch; /* number of current attaches */ time_t shm_atime; /* last shmat time */ time_t shm_dtime; /* last shmdt time */ time_t shm_ctime; /* last change time */ }; ipc_perm ±¸Á¶´Â ¾Õ¿¡¼ ¼³¸íÇÑ °Íó·³ °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢¿¡ ´ëÇÑ Á¢±Ù Çã°¡»çÇ×À» ´ã°í ÀÖ´Ù. ¼Ò½Ä´ë·ÕÀ̳ª Â÷´Ü Ç¥½Ã±â¿Í´Â ´Ù¸£°Ô, ±»Àº¸ð¿Í ±¸Çö¿¡ Á÷Á¢ÀûÀ¸·Î °ü°è°¡ ÀÖÀ¸¹Ç·Î, °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢À» °¡¸®Å°±â À§ÇØ ¾Ë¸ÍÀÌ°¡ »ç¿ëÇÏ´Â ½ÇÁ¦ µ¥ÀÌŸ ±¸Á¶¸¦ ¼³¸íÇÒ ¼ö ¾ø´Ù. À§ÀÇ ±¸Á¶¿¡¼ Ç¥±â XXX ¿Í YYY´Â ÀÌ »ç½ÇÀ» ³ªÅ¸³»±â À§ÇÏ¿© »ç¿ëµÈ °ÍÀÌ´Ù. ½Ã½ºÅÛ È£Ãâ shmgetÀ» »ç¿ëÇÏ¿© °øÀ¯ ±â¾ïÀå¼Ò Á¶°¢À» »ý¼ºÇϰųª ±âÁ¸ÀÇ °Í¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. #include #include #incldue int shmget (key_t key, int size, int shmflag); shmgetÀÌ µ¹·ÁÁÖ´Â °ªÀº °øÀ¯ ±â¾ï Àå¼Ò ½Äº°ÀÚÀÎ shmidÀÌ°í ¸¸¾à ¿¡·¯°¡ ÀϾ°Ô µÇ¸é -1À» µ¹·ÁÁØ´Ù. size µ¶¸³ º¯¼ö´Â ¹ÙÀÌÆ® ´ÜÀ§·Î Á¶°¢ÀÇ Å©±â¸¦ ³ªÅ¸³½´Ù. shmflag µ¶¸³º¯¼ö´Â ´ÙÀ½ ±×¸²°ú °°Àº »ó¼öµéÀÇ Á¶ÇÕÀÌ´Ù. ------------------------------------------------------- | Numeric | Symbolic | Description | ------------------------------------------------------- | 0400 | SHM_R | Read by owner | | 0200 | SHM_W | Write by owner | | 0040 | SHM_R >> 3 | Read by group | | 0020 | SHM_W >> 3 | Write by group | | 0004 | SHM_R >> 6 | Read by world | | 0002 | SHM_W >> 6 | Write by world | | | IPC_CREAT | ¾ÕÀå ÂüÁ¶ | | | IPC_EXCL | ¾ÕÀå ÂüÁ¶ | ------------------------------------------------------- < shmget ½Ã½ºÅÛ È£ÃâÀ» À§ÇÑ shmflag°ª > shmgetÀº °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢À» »ý¼ºÇϰųª ¿¼ö´Â ÀÖÁö¸¸ È£Ãâ ÇÁ·Î¼¼½º°¡ ±×Á¶°¢À¸·Î Á¢±Ù ÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖÁö´Â ¾Ê´Â´Ù. ½Ã½ºÅÛ È£Ãâ shmatÀ» È£ÃâÇÏ¿© °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢À» ºÙ¿©¾ß ÇÑ´Ù. #include #include #include char *shmat (int shmid, char *shmaddr, int shmflag); ÀÌ ½Ã½ºÅÛ È£ÃâÀº °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢ÀÇ ½ÃÀÛ ÁÖ¼Ò¸¦ µ¹·Á ÁØ´Ù. ÀÌ ÁÖ¼Ò¸¦ °áÁ¤ÇÏ´Â ±ÔÄ¢Àº ´ÙÀ½°ú °°´Ù. . shmaddr µ¶¸³º¯¼ö°¡ 0À̸é, ½Ã½ºÅÛÀº È£ÃâÇÑ ÇÁ·Î¼¼½º¸¦ À§ÇÑ ÁÖ¼Ò¸¦ ¼±Á¤ÇÑ´Ù. . shmaddr µ¶¸³º¯¼ö°¡ 0ÀÌ ¾Æ´Ï¸é, µ¹·ÁÁÖ´Â ÁÖ¼Ò¸¦ È£Ãâ ÇÁ·Î¼¼½º°¡ shmflag µ¶¸³º¯¼ö·Î SHM_RND°ªÀ» ¸í½ÃÇß´ÂÁö ¿©ºÎ¿¡ µû¶ó ´Ù¸£´Ù. - ¸¸¾à SHM_RND°ªÀÌ ¸í½ÃµÇÁö ¾Ê¾Ò´Ù¸é, °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢Àº shmaddr µ¶¸³º¯¼ö¿¡ ÀÇÇØ ¸í½ÃµÈ ÁÖ¼Ò¿¡ ºÙÀδÙ. - ¸¸¾à SHM_RND°ªÀÌ ¸í½ÃµÇ¾ú´Ù¸é, °øÀ¯±â¾ï Àå¼Ò Á¶°¢Àº shmaddr µ¶¸³ º¯¼ö¿¡ ÀÇÇØ ¸í½ÃµÈ ÁÖ¼Ò¸¦ »ó¼ö SHMLBA(LBA sms "lower bound address"ÀÇ ¾àÀÚÀÌ´Ù)¸¸Å °¨¼Ò½ÃŲ ÁÖ¼Ò¿¡ ºÙÀδÙ. ½ÇÁ¦ÀûÀÎ ¸ñÀû¿¡¼´Â ÀÌ½Ä °¡´ÉÇÑ shmat¿¡ ´ëÇÑ È£Ãâ·Î½á shmaddrÀ» 0À¸·Î ¸í½ÃÇÏ°í, ¾Ë¸ÍÀÌ°¡ ÁÖ¼Ò¸¦ ¼±ÅÃÇϵµ·Ï ÇÑ´Ù. ±âº»ÀûÀ¸·Î´Â °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢Àº È£Ãâ ÇÁ·Î¼¼½º°¡ ÀÐ°í ¾µ ¼ö ÀÖµµ·Ï ºÎÂøÇÑ´Ù. ¶ÇÇÑ, "Àбâ Àü¿ë"Á¢±ÙÀ» ¸í½ÃÇÏ¸é¼ SHM_RDONLY °ªÀ» shmflag µ¶¸³º¯¼ö¿¡ ¸í½ÃÇÒ ¼ö ÀÖ´Ù. ÇÁ·Î¼¼½º°¡ °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢ÀÇ »ç¿ëÀ» ³¡³ª°Ô µÇ¸é ½Ã½ºÅÛ È£Ãâ shmdtÀ» »ç¿ëÇÏ¿© Á¶°¢À» ºÐ¸®ÇÑ´Ù. #include #include #include int shmdt (char *shmaddr); ÀÌ È£ÃâÀº °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢À» ¾ø¾ÖÁö´Â ¾Ê´Â´Ù. °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢À» Á¦°ÅÇϱâ À§Çؼ´Â ½Ã½ºÅÛ È£Ãâ shmctlÀ» »ç¿ëÇÑ´Ù. #include #include #include int shmctl (int shmid, int cmd, struct shmid_ds *buf); cmd°ªÀ¸·Î IPC_RMID¸¦ ¸í½ÃÇÏ¸é ½Ã½ºÅÛ¿¡¼ °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢À» Á¦°ÅÇÑ´Ù. Revision History ÀÛ¼ºÀÏÀÚ : 96.06.17 ÀÛ¼ºÀÚ : ÀÌÁø¼ö ¼öÁ¤ÀÏÀÚ : ¼öÁ¤ÀÚ