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
ÀÛ¼ºÀÚ : ÀÌÁø¼ö

¼öÁ¤ÀÏÀÚ : 
¼öÁ¤ÀÚ