¹ø È£ : 642 °Ô½ÃÀÚ : Çѵ¿ÈÆ (ddoch ) µî·ÏÀÏ : 1997-07-04 02:30 Á¦ ¸ñ : [°­ÁÂ] ½Ã½ºÅÛ V IPC - ¼¼¸¶Æ÷¾î (2) 3. ¼¼¸¶Æ÷¾î ¼¼¸¶Æ÷¾î¿¡ ´ëÇؼ­´Â Á¤¸» ¸»ÀÌ ¸¹½À´Ï´Ù. ¿î¿µÃ¼Á¦ °³·Ð¼­¿¡µµ ¼¼¸¶Æ÷¾î´Â ºüÁöÁö ¾Ê´Â ´Ü°ñ ¼Õ´ÔÀÔ´Ï´Ù. :) ¾Æ¿ï·¯ Linux & UNIX ÇÁ·Î±×·¡¹ÖÀ» óÀ½ ¹è¿ì½Ã´Â ºÐ¿¡ °Ô´Â °øÆ÷ÀÇ ´ë»ó(?)À̱⵵ ÇÕ´Ï´Ù. ( Àâ´ã: Á» Áö³­ À̾߱âÁö¸¸ ¸®´ª½º Ãʺ¸ÀÚ °Ô½ÃÆÇ¿¡ ¼¼¸¶Æ÷¾î¿¡ °ü·ÃµÈ Áú¹®ÀÌ ¿Ã ¶ó¿Â ÀûÀÌ ÀÖ½À´Ï´Ù. ¹°·Ð Áú¹®ÇϽŠºÐµµ Ãʺ¸ÀÚ¶ó°í »ý°¢Çϼ̴ Áö´Â ¸ð¸£°ÚÁö ¸¸, ¸®´ª½º ¼³Ä¡³ª ÀϹÝÀûÀÎ Áú¹®À» ´Ù·ç´Â °Ô½ÃÆÇ¿¡ ¼¼¸¶Æ÷¾î°¡ À߾ȵȴٽø鼭 ¼Ò½º¿¡ ´ëÇÑ ¼³¸í°ú ±× Áõ»ó±îÁö Ä£ÀýÇÏ°Ô ¼³¸íÇØÁֽô ¹Ù¶÷¿¡ °Ô½ÃÆÇ ´ã´çÀںР°ú ¸îºÐÀÌ ´©·¸°Ô ¶á ÀÏÀÌ ÀÖ½À´Ï´Ù. ´©±¸º¸°í ´äº¯À» Ç϶ó´Â ¼Ò¸®ÀÎÁö... °øºÎÇϽô °Íµµ ÁÁÁö¸¸ Ãʺ¸ÀÚ °Ô½ÃÆÇ¿¡ ÀÌ·± ³»¿ëÀ» ¿Ã·Á³õÀ¸¸é ÀÌÁ¦ ±×³ª¸¶ ¿­ ½ÉÈ÷ ¸®´ª½º °øºÎÇÏ·Á°í µé·¯½Ã´Â ºÐµéÀÇ ÀÇ¿åÀ» ²©¾î ³õÀ» ¼öµµ ÀÖ°ÚÁÒ? :) ) ( Àâ´ã: ±×·¸±ä ÇÏÁö¸¸, IPC ÀÇ ¼¼¸¶Æ÷¾î´Â Linux & UNIX ÇÁ·Î±×·¡¹ÖÀ» °øºÎÇϽ÷Á ¸é ±âº»ÀûÀ¸·Î Å͵æÇÏ¿©¾ß ÇÒ ±âº»ÀûÀÎ ³»¿ëÀ̶ó°í »ý°¢ÇÕ´Ï´Ù. ¹°·Ð ÀÌ·¯ÇÑ ÇÁ ·Î¼¼½º µ¿±âÈ­¿¡ °ü·ÃµÈ ´Ù¸¥ ¹æ¹ýÀ» »ç¿ëÇϽŴٴøÁö ÀÚü·Î ¹æ¹ýÀ» °³¹ßÇÏ¿© »ç ¿ëÇϽŠ´Ù¸é º°·Î »ç¿ëÇÒ ÀÏÀÌ ¾ø°ÚÁö¸¸, ±×·¸´Ù ÇÏ´õ¶óµµ ±âº» °³³äÀ» ¾Ë¾ÆµÎ½Ã ¸é µµ¿òÀÌ ¹Ýµå½Ã µÉ °Ì´Ï´Ù. ) °¡. ¼¼¸¶Æ÷¾îÀÇ Á¤ÀÇ ¿Ö ¼¼¸¶Æ÷¾î¸¦ ¾î·Æ°Ô »ý°¢ÇÒ±î¿ä? ±× ÀÌÀ¯´Â ´Ù¸¥ µÎ°³ÀÇ IPC ¼³ºñ¿Í´Â ´Þ¸® ¼¼¸¶ Æ÷¾î´Â ¾Ë°í¸®ÁòÀÌ °³ÀԵDZ⠶§¹®ÀÔ´Ï´Ù. ´Ù¸¥ µÎ°³ÀÇ IPC ¼³ºñ´Â ¾ÆÀ̵ð¾î Â÷¿øÀÌ Áö¸¸ ¼¼¸¶Æ÷¾î´Â ÇÁ·Î¼¼½º µ¿±âÈ­¸¦ À§ÇØ ÇмúÀûÀ¸·Î ¿¬±¸µÈ °³³äÀÔ´Ï´Ù. ¿ø·¡ 'Dijkstra' °¡ Á¦¾ÈÇÏ¿´À¸¸ç, ¼¼¸¶Æ÷¾î¿¡ º¸¸é µÎ°³ÀÇ, wait ¿Í signal ¿¡ ÇØ´çÇÏ´Â p(passeren) ¿Í v(vrjgeven) °¡ ÀÖ½À´Ï´Ù. ¼¼¸¶Æ÷¾î´Â ½ÇÁ¦ »ç¿ë¿¡ À־´Â ÇÁ·Î¼¼½º µ¿±âÈ­¿¡ °ü·ÃÇÏ´Â ÇϳªÀÇ º¯¼öÀÇ ¹è¿­ À» ¸»ÇÕ´Ï´Ù. °¡Àå °£´ÜÇÑ ¼¼¸¶Æ÷¾î´Â 0°ú 1ÀÇ °ª¸¸ »ç¿ëÇÏ´Â ÀÌÁø(¹ÙÀ̳ʸ®)¼¼¸¶ Æ÷¾îÀÔ´Ï´Ù. ¹è¿­À» »ç¿ëÇÏ´Â ¼¼¸¶Æ÷¾î´Â º¸Åë 'ÀϹÝÀûÀÎ' ¼¼¸¶Æ÷¾î¶ó°í ¸»ÇÏÁö¿ä. ¿©±â¿¡¼­´Â ÀÌÁø ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÏ°Ú½À´Ï´Ù. ¹°·Ð ÀÌÁø ¼¼¸¶Æ÷¾î¸¸À» »ç¿ëÇÑ´Ù°í ÇÒÁö¶óµµ ¾îÁö°£ÇÑ ÇÁ·Î¼¼½º µ¿±âÈ­ ¹®Á¦¸¦ ÇØ°áÇÏ´Â µ¥´Â ÃæºÐÇÕ´Ï´Ù. ÀÌÁ¦ p ¿Í v ¿¡ ´ëÇؼ­ ¾Ë¾Æº¸°Ú½À´Ï´Ù. p ¿Í v ´Â ÇϳªÀÇ µ¿ÀÛÀ» ÀǹÌÇÏ´Â µ¥, Àß »ìÆ캸¸é Àç¹ÌÀÖ½À´Ï´Ù. ¿©±â¿¡¼­ sv ´Â 0°ú 1ÀÇ °ªÀ» °¡Áö´Â ÀÌÁø ¼¼¸¶Æ÷¾î º¯ ¼ö¸¦ ÀǹÌÇÕ´Ï´Ù. * p(sv) sv °¡ 0º¸´Ù Å©´Ù¸é, sv ¸¦ °¨¼Ò½ÃŲ´Ù. sv °¡ 0À̶ó¸é, ÀÌ ÇÁ·Î¼¼½º ÀÇ ¼öÇàÀ» ÁߴܽÃŲ´Ù. * v(sv) Áß´ÜµÈ ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ¼öÇàÀ» Àç°³½ÃŲ´Ù. Áß´ÜµÈ ÇÁ·Î¼¼½º°¡ ¾ø´Ù ¸é sv ¸¦ Áõ°¡½ÃŲ´Ù. ¼¼¸¶Æ÷¾î´Â ÀӰ迵¿ª¿¡¼­ ÁÖ·Î »ç¿ëµÈ´Ù°í ¾Õ¿¡¼­ ¸»¾¸µå·È½À´Ï´Ù. À§¿¡¼­ÀÇ ¿¹¿Í °°ÀÌ ÆÄÀÏÀ» ¿­¾î¼­ ¾²´Â ºÎºÐ±îÁö¸¦ ÀӰ迵¿ªÀ¸·Î ¼³Á¤ÇÏ°í p ¿Í v ÀÇ µ¿ÀÛÀ» ¼³ ¸íµå¸®°Ú½À´Ï´Ù. ÀÌ·¸°Ô °¡Á¤Çϸé ÇØ´çÄÚµåÀÇ ÀӰ迵¿ªÀº ´ÙÀ½°ú °°ÀÌ µÉ °ÍÀÌ°í ÀӰ迵¿ªÀÇ µé¾î°¡´Â ºÎºÐ°ú ³ª¿À´Â ºÎºÐÀ» ÀÇ»çÄÚµå·Î Ç¥½ÃÇÏ¸é ´ÙÀ½°ú °°ÀÌ µÉ °Í ÀÔ´Ï´Ù. ÀӰ迵¿ªÀÇ ¹Û (non-critical code section) p(sv); ÇØ´çÆÄÀÏÀ» ¿¬´Ù. ---+ ÀÓ°è ( critical code ÇØ´çÆÄÀÏ¿¡ ¾´´Ù. ---+ ¿µ¿ª section ) v(sv); ÀӰ迵¿ªÀÇ ¹Û (non-critical code section) ÀӰ迵¿ªÀÇ ¹ÛÀº »ó°ü¾øÁö¸¸, ÀӰ迵¿ªÀÇ ¾ÈÂÊÀº Çѹø¿¡ ÇϳªÀÇ ÇÁ·Î¼¼½º¸¸ÀÌ ¼öÇà µÇ¾î¾ß ÇÕ´Ï´Ù. ±×·¸Áö ¾Ê´Ù¸é À§¿¡¼­ ¼³¸íÇÑ ¹Ù¿Í °°Àº Å©·´ÀÌ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï ´Ù. º¸Åë ÀÌÁø ¼¼¸¶Æ÷¾î º¯¼öÀÇ ÃʱⰪÀº óÀ½¿¡ 1·Î ¼³Á¤µË´Ï´Ù. Áï, ¿©±â¼­´Â sv ÀÇ ÃʱⰪÀÌ 1À̶ó´Â °ÍÀÔ´Ï´Ù. ÀÌÁ¦ ÇÁ·Î¼¼½º P1 ÀÌ ÆÄÀÏ¿¡ ¾²±â ÀÛ¾÷À» Çϱâ À§ÇØ ÀӰ迵¿ª¿¡ ´Ù°¡¿À°Ô µÇ¸é, p ¸¦ ¼öÇàÇÏ°Ô µË´Ï´Ù. sv ÀÇ °ªÀÌ 1À̶ó´Â °ÍÀº ¾ÆÁ÷ ÀӰ迵¿ªÀÌ »ç¿ëÁßÀÌ ¾Æ´Ï¶ó ´Â Àǹ̸¦ °¡Áö°Ô µÇ¹Ç·Î P1Àº sv ¸¦ 0À¸·Î ¼³Á¤ÇÏ°í ÀӰ迵¿ªÀ» ¼öÇàÇÕ´Ï´Ù. ÇÁ·Î ¼¼½º P2 µµ ÀӰ迵¿ª¿¡ ÁøÀÔÇϱâ À§ÇØ p ¸¦ ¼öÇàÇÕ´Ï´Ù. ÇÏÁö¸¸ sv ÀÇ °ªÀÌ ÀÌ¹Ì 0À̹ǷΠÀӰ迵¿ªÀÌ »ç¿ëÁßÀÌ¶ó¼­ ½Ã½ºÅÛ¿¡ ÀÇÇØ Àáµé°Ô µË´Ï´Ù. ±×µ¿¾È P2 ´Â ÆÄÀÏ¿¡ ¾²´Â ÀÛ¾÷±îÁö ¸¶Ä¡°í ´õÀÌ»ó ÀӰ迵¿ª¿¡ ÀÖÀ» ÇÊ¿ä°¡ ¾øÀ» °æ¿ì°¡ µÇ¾î¼­ ÀӰ迵¿ªÀ» ¹þ¾î³ª±â À§ÇØ v ¸¦ ¼öÇàÇÕ´Ï´Ù. v ¸¦ ¼öÇàÇϸ鼭 sv ÀÇ °ªÀ» 1·Î ¼³Á¤ ÇÏ°í ÀáÀÚ´Â ÇÁ·Î¼¼½º¸¦ Àϱú¿ó´Ï´Ù. À̶§ P1 Àº Àá¿¡¼­ ±ú¾î³ª¼­ sv °¡ 1·Î ¼³Á¤ µÇ¾úÀ½À» ¾Ë°í ÀӰ迵¿ªÀ» ¼öÇàÇÕ´Ï´Ù. ÀÌ·¸°Ô ÀӰ迵¿ªÀº Çѹø¿¡ ÇϳªÀÇ ÇÁ·Î¼¼½º ¸¸ÀÌ ¼öÇàµÇµµ·Ï ÇÏ´Â °ÍÀÌ ÀӰ迵¿ª¿¡¼­ÀÇ ÇÁ·Î¼¼½ºÀÇ µ¿±âÈ­ ¶ó°í º¸Åë À̾߱â ÇÕ ´Ï´Ù. ¹°·Ð ÇÁ·Î¼¼½º°¡ ¸¹¾Æµµ ÀÌ·± ÀÛ¾÷Àº ¼ø½Ä°£¿¡ 󸮵DZ⠶§¹®¿¡ Àáµå´Â ½Ã°£ Àº ¾ÆÁÖ ÂªÀº ½Ã°£ÀÌ µË´Ï´Ù. ¿©±â¿¡¼­ ÇÊ¿äÇÑ sv ´Â ½Ã½ºÅÛ Àü¿ª¿¡ °ÉÄ£ º¯¼ö°¡ µÇ¾î¾ß ÇÏ´Â µ¥ ÀÌ·¯ÇÑ ¼³ºñ¸¦ ÀϹÝÀûÀ¸·Î ¼¼¸¶Æ÷¾î¶ó°í À̾߱â ÇÏ´Â °ÍÀÔ´Ï´Ù. (Àâ´ã: ¹°·Ð ÇÁ·Î¼¼½º µ¿±âÈ­¸¦ ½ÃÅ°´Â µ¥ ²À ¼¼¸¶Æ÷¾î¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Â °ÍÀº ¾Æ´Õ ´Ï´Ù. ÀÚ½ÅÀÌ ¸¸µç ¾î¶°ÇÑ ¹æ¹ýÀ» »ç¿ëÇϰųª ÇÁ·Î±×·¥ÀÇ ±Ô¸ð°¡ ÀÛÀ» °æ¿ì¿¡´Â °£´ÜÇÏ°Ô ÆÄÀÏÀ» ¸¸µé¾î¼­ Ç¥½ÃÇØ µÎ´Â ¹æ¹ýÀ» »ç¿ëÇϱ⵵ ÇÕ´Ï´Ù. ÀÌ·² °æ¿ì¿¡ º° ¹®Á¦°¡ ¾øÀ» ¼öµµ ÀÖÁö¸¸ ÇÁ·Î±×·¥ÀÌ Á¶±Ý¸¸ Ä¿Áö¸é ±Ý¹æ ¹®Á¦°¡ µå·¯³³´Ï´Ù. ¸®´ª½º¿¡¼­ Åë½ÅÇÁ·Î±×·¥À¸·Î ³Î¸®¾Ë·ÁÁø seyon µµ ÀÌ·± ¹æ¹ýÀ» »ç¿ëÇÕ´Ï´Ù. º¸Åë ¸ðµ©Àº ÇϳªÀ̹ǷΠÇϳªÀÇ ÇÁ·Î¼¼½º°¡ óÀ½À¸·Î seyon À» ¶ç¿ì°Ô µÇ¸é ´Ù¸¥ »ç¶÷µé Àº ¾µ ¼ö ¾øµµ·Ï ¸¸µé¾î¾ß ÇÕ´Ï´Ù. ÀÌ ¸ñÀûÀ» À§Çؼ­ 'Àá±Ý(lock)ÆÄÀÏ'À» ¸¸µé¾î µÎ´Â µ¥, ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ ¶§ ÇØ´ç ÆÄÀÏÀÌ ÀÖÀ¸¸é, ½ÇÇàÀ» ÇÏÁö ¾Ê°í ¿¡·¯ ¸Þ½ÃÁö ¸¦ ³»´Â °æ¿ìÀÔ´Ï´Ù. ±×·¯³ª, ÇÁ·Î±×·¥ÀÌ Á¤»óÀûÀ¸·Î Á¾·áÇϸ鼭 Àá±ÝÆÄÀÏÀ» Áö¿ö ¾ß ÇÏ´Â µ¥ ±×·¸Áö ¸øÇÑ ºñÁ¤»óÀûÀÎ Á¾·á½Ã¿¡´Â ÀÌ·¯ÇÑ ÆÄÀÏÀ» ³²±æ ¼öµµ ÀÖ½À´Ï´Ù. ÀÌ·² ¶§´Â »ç¿ëÀÚ°¡ Á÷Á¢ ÇØ´ç ÆÄÀÏÀ» ã¾Æ¼­ Áö¿öÁà¾ß ÇÕ´Ï´Ù. ¾Æ¸¶µµ ÀÌ·± °æÇè Àº Çѹø¾¿Àº ÀÖÀ¸½Ç °Ì´Ï´Ù. ¾ó¸¶Àü¿¡ ÇÁ·Î±×·¥À» Çϳª © ÀÏÀÌ ÀÖ¾ú´Â µ¥, ±Ô¸ð´Â Áß°£±Þ Á¤µµ¿´Áö¸¸ ¼¼¸¶Æ÷¾î ¸¦ »ç¿ëÇϱⰡ ±ÍÂú¾Æ¼­ Àá±ÝÆÄÀÏÀ» ¸¸µé¾î¼­ ÇÁ·Î¼¼½ºÀÇ µ¿±âÈ­¸¦ ó¸®ÇÑ ÀûÀÌ ÀÖ ¾ú½À´Ï´Ù. ¾ó¸¶µ¿¾ÈÀº ÇÁ·Î±×·¥ÀÌ Àß ½ÇÇàÀÌ µÇ´õ´Ï ¾î´À³¯ ÇÁ·Î±×·¥ÀÇ ºñÁ¤»óÀû ÀÎ Áß´ÜÀÌÈÄ¿¡´Â ÇÁ·Î±×·¥ÀÌ À¯µ¶ ÇÑÁöÁ¡¿¡¼­¸¸ ½ÇÇàÀ» ¸ØÃß´õ±º¿ä. Àü Àá±ÝÆÄÀÏÀº »ý°¢µµ ¾ÈÇÏ°í ¾îµð°¡ À߸øµÆ³ª ÇÏ°í ¿À·£½Ã°£À» ¼Ò½º¸¦ µÚÁ®¼­ ã±â¿¡ Á¤½ÅÀÌ ¾ø ¾ú½À´Ï´Ù¸¸ Àá±ÝÆÄÀÏÀÌ ÀÖ´Â °ÍÀ» ¹ß°ßÇÏ°í ¾´¿ôÀ½À»ÁöÀº ÀûÀÌ ÀÖ½À´Ï´Ù. Àá±ÝÆÄÀÏÀ» ¸¸µå´Â ¹æ¹ýÀº °£´ÜÇÑ ÀÛ¾÷¿¡´Â ¾µ¸¸ÇÒ ¼öµµ ÀÖÀ¸³ª, ±Ô¸ð°¡ Å« ÇÁ·Î±× ·¥¿¡´Â Àû´çÇÏÁö ¸øÇÏ´Ù´Â °ÍÀ» ´À³¤ ÀûÀÌ ¾Æ´Ï¿´³ª ÇÕ´Ï´Ù. ) ¼¼¸¶Æ÷¾î¸¦ ½ÇÁ¦·Î »ç¿ëÇÒ ¶§´Â »ý°¢º¸´Ù ¾ÆÁÖ ½±½À´Ï´Ù. Á¶±ÝÀÖ´Ù ¸»¾¸µå¸®°ÚÁö¸¸ »ý°¢º¸´Ù ¾î·ÆÁö ¾Ê´Ù´Â °ÍÀ» ¾Ë¾ÆµÎ½Ã±â ¹Ù¶ø´Ï´Ù. ¼¼¸¶Æ÷¾îÀÇ ÇÙ½ÉÀûÀÎ ±â´ÉÀº ÀÌ¹Ì ´Ù °®Ãß¾îÁ® ÀÖÀ¸¹Ç·Î ¿ì¸®´Â ±×°ÍÀ» Áñ±â±â¸¸ ÇÏ¸é µÈ´Ù´Â °ÍÀÔ´Ï´Ù. ³ª. ¼¼¸¶Æ÷¾î ÇÔ¼ö ¼¼¸¶Æ÷¾î ¼³ºñ´Â °ü·ÃµÇ´Â ¼¼°³ÀÇ ÇÔ¼ö·Î ÀÌ·ç¾îÁ® ÀÖ½À´Ï´Ù. °ü·Ã Çì´õÆÄÀÏÀº ÀÚ·á Çü Á¤ÀÇ¿¡ ÇÊ¿äÇÑ ¿Í IPC ¼³ºñ¿¡ ÀϹÝÀûÀ¸·Î ÇÊ¿äÇÑ ¿Í ¼¼¸¶Æ÷¾î¿¡ ÇÊ¿äÇÑ Æ¯¼öÇÑ Á¤ÀǸ¦ Æ÷ÇÔÇϱâ À§Çؼ­ °¡ ÇÊ¿äÇÕ´Ï´Ù. ÀÌ°ÍÀº ´Ù¸¥ °øÀ¯¸Þ¸ð¸® (sys/shm.h)¿Í ¸Þ½ÃÁö Å¥ (sys/msg.h) µµ ¸¶Âù°¡ÁöÀÔ´Ï´Ù. ÇÔ¼ö¸¦ Çϳª¾¿ »ìÆ캼±î¿ä? ¤¡. semget int semget(key_t key, int nsems, int semflg); semget ÇÔ¼ö´Â ¼¼¸¶Æ÷¾î¸¦ ¸¸µé°Å³ª key ¿¡ ÇØ´çÇÏ´Â ¼¼¸¶Æ÷¾î ½Äº°ÀÚ¸¦ µ¹·ÁÁÝ´Ï´Ù. key ´Â ÇÁ·Î¼¼½º¿Í´Â µ¶¸³ÀûÀ¸·Î µ¿ÀÏÇÑ ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇÏ´Â °ÍÀ» °¡´ÉÇÏ°Ô ÇÕ´Ï´Ù. semget Àº ÀÌ key °ªÀ» Âü°íÇÏ¿© ÇØ´ç ¼¼¸¶Æ÷¾î ½Äº°ÀÚ¸¦ µ¹·ÁÁÝ´Ï´Ù. ¼¼¸¶Æ÷¾î¿¡¼­ key ´Â semget ¿¡¼­¸¸ »ç¿ëÇϸç, ´Ù¸¥ ÇÔ¼öµé¿¡¼­´Â semget ¿¡¼­ ¹ÝȯµÈ ¼¼¸¶Æ÷¾î ½Äº°ÀÚ¸¦ »ç¿ëÇÕ´Ï´Ù. key °ªÁß Æ¯º°ÇÑ °ªÀÌ ÀÖ´Â µ¥, IPC_PRIVATE °¡ ±×°ÍÀÔ´Ï´Ù. IPC_PRIVATE ¸¦ key °ªÀ¸·Î »ç¿ëÇÏ¿© ¼¼¸¶Æ÷¾î¸¦ ¸¸µé°Ô µÇ¸é ÇÁ·Î¼¼½º Àڱ⸸ ¼¼¸¶ Æ÷¾î¿¡ Á¢±ÙÇÒ ¼ö ÀÖ°Ô µÇ´Â °ÍÀÔ´Ï´Ù. ÀÏÁ¾ÀÇ È¥ÀÚ¸¸ ¾Ë°í ÀÖ´Â 'back door' ¶ó°í ÇÒ±î¿ä? :) nsems ´Â »ç¿ëÇÒ ¼¼¸¶Æ÷¾îÀÇ º¯¼öÀÇ °¹¼öÀÔ´Ï´Ù. º¸Åë 2°³ ÀÌ»ó »ç¿ëÇÒ ¶§µµ ÀÖÀ¸ ³ª 1°³Á¤µµ¸¸ Çصµ ´ëºÎºÐÀÇ °æ¿ì¿¡ ÃæºÐÇÕ´Ï´Ù. semflg ÀÇ ÇÏÀ§ 9ºñÆ®´Â ÆÄÀÏ Á¢±Ù±ÇÇÑÀ» ³ªÅ¸³¯ ¶§ »ç¿ëµÇ´Â 9ºñÆ®¿Í µ¿ÀÏÇÕ´Ï´Ù. Àß ¾Æ½Ã´Ù½ÃÇÇ, '666' Àº ¸ðµç ÇÁ·Î¼¼½ºµéÀÌ ÀÐ°í ¾µ ¼ö ÀÖµµ·Ï ÇÏ´Â °ÍÀÌÁÒ.. ÀÌ°Í°ú ÇÔ²² ´Ù¸¥ Ç÷¡±×¸¦ ºñÆ® OR ¿¬»êÇÒ ¼ö ÀÖ½À´Ï´Ù. IPC_CREAT ¸¦ »ç¿ëÇϸé, ¼¼¸¶Æ÷¾î¸¦ ¸¸µì´Ï´Ù. ¸¸ÀÏ ¼¼¸¶Æ÷¾î°¡ Á¸ÀçÇÒ °æ¿ì¿¡´Â IPC_CREAT ´Â ¹«½ÃµÇ¾î¼­, ÇØ´ç ¼¼¸¶Æ÷¾îÀÇ ½Äº°ÀÚ¸¸ µ¹·ÁÁÝ´Ï´Ù. IPC_EXCL Àº IPC_CREAT ¿Í ÇÔ²² »ç¿ëµÇ´Âµ¥, ÀÌ °æ¿ì¿¡´Â ¼¼¸¶Æ÷¾î°¡ ¾øÀ¸¸é ¸¸µé°Ô µÇÁö¸¸, ÀÖÀ» °æ¿ì¿¡´Â ¿¡·¯¸¦ ¹ÝȯÇÕ´Ï´Ù. 'man semget' Çغ¸½Ã¸é ¾Æ½Ã°ÚÁö¸¸, ÀÌ°æ¿ì¿¡´Â errno ´Â EEXIST ¿¡·¯ÄÚµå·Î ¼³Á¤ µË´Ï´Ù. ÇØ´ç ÇÁ·Î¼¼½º°¡ Á¢±Ù±ÇÇÑÀ» °¡Áö°í ÀÖÁö ¾Ê´Ù¸é errno ´Â EACCES ·Î ¼³Á¤ µÇ°ÚÁÒ? ÀÌ·¯ÇÑ ÀÚ¼¼ÇÑ »çÇ×°ú ½Ã½ºÅÛÀÇ ÀÚ¿ø Á¦ÇÑ¿¡ ´ëÇÑ »çÇ×Àº 'man ÇØ´çÇÔ¼ö' ·Î ´õ ÀÚ¼¼È÷ ¾Ë¾Æº¸½Ã±â ¹Ù¶ø´Ï´Ù. ½ÇÁ¦ »ç¿ëÀÇ ¿¹¸¦ µé¾îº¸°Ú½À´Ï´Ù. int semid; semid = semget((key_t)1234, 1, 0666 | IPC_CREAT); ÀÌ °æ¿ì¿¡´Â key °ªÀÌ 1234 ÀÌ°í, Á¢±Ù±ÇÇÑÀ» ¸ðµÎ¿¡°Ô Çã¿ëÇÏ´Â ¼¼¸¶Æ÷¾î º¯¼ö ÇÑ °³¸¦ »ý¼ºÇÕ´Ï´Ù. semid ¿¡´Â ÀÌÈÄÀÇ ÇÔ¼ö¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â ½Äº°ÀÚ°¡ ¹ÝȯµË´Ï´Ù. int semid; if ((semid = semget((key_t)100, 1, 0666 | IPC_CREAT | IPC_EXCL)) == -1) { if (errno == EEXIST) { semid = semget((key_t)100, 1, 0); } } else { /* semctl ·Î ¼¼¸¶Æ÷¾îÀÇ °ªÀ» ÃʱâÈ­ */ } º¸Åë ÀÌ·¸°Ô ¸¹ÀÌ »ç¿ëÇÕ´Ï´Ù. óÀ½¿¡ semget ÇÔ¼ö´Â key °ªÀÌ 100ÀÌ°í, Á¢±Ç±ÇÇÑ ÀÌ 0666ÀÎ ¼¼¸¶Æ÷¾î¸¦ Çϳª ¸¸µé°í ±× ½Äº°ÀÚ¸¦ semid ¿¡ µ¹·ÁÁÝ´Ï´Ù. ±×·¯³ª ÇØ´ç ¼¼¸¶Æ÷¾î°¡ ÀÌ¹Ì Á¸ÀçÇÒ °æ¿ì¿¡´Â -1À» ¹ÝȯÇÏ°í errno ´Â EEXIST ·Î ¼³Á¤µÇ±â ¶§¹® ¿¡ ¹Ù·Î ¹ØºÎºÐ¿¡¼­ semget ÇÔ¼ö¸¦ ´Ù½Ã »ç¿ëÇÏ¿© semid ¿¡ ½Äº°ÀÚ¸¦ ¾ò°í ÀÖ½À´Ï´Ù. else ºÎºÐ¿¡¼­´Â ÀÌÈÄ¿¡ ¸»¾¸µå¸®°ÚÁö¸¸ ¼¼¸¶Æ÷¾î º¯¼öÀÇ ÃʱâÈ­ ÀÛ¾÷À» ¼öÇàÇÕ´Ï´Ù. ¼¼¸¶Æ÷¾î º¯¼öÀÇ ÃÖ±âÈ­´Â óÀ½¿¡ º¸Åë Çѹø¸¸ ¼öÇàµÇ¾î¾ß Çϱ⠶§¹®¿¡ ÇØ´ç ¼¼¸¶Æ÷ ¾î¸¦ »ý¼ºÇÑ ÇÁ·Î¼¼½º¸¸ÀÌ ¼öÇàÇÏ°Ô µÇ°ÚÁö¿ä? óÀ½ÀÇ semget ¿¡¼­ IPC_EXCL À» ¾ø ¾Ö¹ö¸®°í »ç¿ëÇϸé semid ¸¦ ¾ò´Â µ¥´Â ÁöÀåÀÌ ¾øÁö¸¸ semget ÀÇ ¹Ýȯ°ªÀÌ ÇÁ·Î¼¼½º ¸¶´Ù °°¾Æ¼­ ÀÌÈÄ¿¡ ¸¶¶¥È÷ semctl ·Î ¼¼¸¶Æ÷¾îÀÇ °ªÀ» ÃʱâÈ­ÇÒ ¹æ¹ýÀÌ ¾ø¾îÁý´Ï´Ù. Áï, ÃÖÃÊÀÇ ÇÁ·Î¼¼½º´Â ¼¼¸¶Æ÷¾î¸¦ »ý¼ºÇÏ°í ¼¼¸¶Æ÷¾îÀÇ °ªÀ» ÃʱâÈ­ÇÏÁö¸¸, ±× ÀÌ ÈÄÀÇ ÇÁ·Î¼¼½º´Â ¼¼¸¶Æ÷¾î ½Äº°ÀÚ¸¸ ¾òµµ·Ï µÇ¾î ÀÖ½À´Ï´Ù. semget Àº ¼öÇàÀÌ ½ÇÆÐÇßÀ» °æ¿ì¿¡´Â -1, ¼º°øÇßÀ» °æ¿ì¿¡´Â ÇØ´ç ¼¼¸¶Æ÷¾î ½Äº°ÀÚ ¸¦ µ¹·ÁÁÝ´Ï´Ù. ¤¤. semctl int semctl ( int semid, int semnum, int cmd, union semun arg ) semctl Àº ÀÌ¹Ì Á¸ÀçÇÏ´Â ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ Á¦¾î ÀÛ¾÷À» ¼öÇàÇÕ´Ï´Ù. Áï, semid ¿¡ ÀÇÇØ ÁöÁ¤µÈ ¼¼¸¶Æ÷¾î ÁýÇÕÁß¿¡ semnum ¹ø° ¼¼¸¶Æ÷¾î¸¦ cmd ·Î Á¦¾î¸¦ ÇÏ´Â °ÍÀÔ´Ï´Ù. semid ´Â ¹Ù·Î ¾Õ¿¡¼­ »ìÆ캻 semget ¿¡¼­ ¹ÝȯµÇ´Â ¼¼¸¶Æ÷¾î ½Äº°ÀÚÀÔ´Ï´Ù. semnum Àº Á¦¾î¸¦ ¼öÇàÇÒ ÇØ´ç ¼¼¸¶Æ÷¾îÀÇ À妽ºÀÔ´Ï´Ù. ù¹ø° ¼¼¸¶Æ÷¾î º¯¼ö´Â 0¹øÀÔ´Ï´Ù. ¿©±â¼­´Â ÇϳªÀÇ ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇϹǷΠ°è¼Ó 0¹ø¸¸ µË´Ï´Ù. cmd ¿¡´Â ¿©·¯ °ªÀÌ ÀÖÁö¸¸ ¸¹ÀÌ »ç¿ëµÇ´Â °Í¸¸ ¸»¾¸µå¸®°Ú½À´Ï´Ù. SETVAL Àº ¼¼¸¶Æ÷¾îÁýÇÕÀÇ semnum¹ø° ¿ø¼ÒÀÇ semvalÀÇ °ªÀ» arg.val·Î ¼³Á¤ÇÕ´Ï´Ù. arg ´Â semun °ø¿ëü º¯¼öÀε¥ Àá½ÃµÚ¿¡ ¼³¸íµå¸®°Ú½À´Ï´Ù. IPC_RMID ´Â ÇØ´ç ¼¼¸¶Æ÷¾î¸¦ Á¦°ÅÇÏ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. ³ª¸ÓÁöµµ ¿©·¯°¡Áö°¡ ÀÖÁö ¸¸ ÀÚÁÖ »ç¿ëÇÏ°Ô µÇÁö´Â ¾Ê°Ô µÉ °ÍÀÔ´Ï´Ù. semun °ø¿ëü´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ½À´Ï´Ù. union semun { int val; /* used for SETVAL only */ struct semid_ds *buf; /* for IPC_STAT and IPC_SET */ ushort *array; /* for GETALL and SETALL */ }; ¿©±â¿¡¼­ val ¸â¹ö´Â semval ÀÇ °ªÀ» ¼³Á¤ÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. ÀÌ¿Õ ¸»ÀÌ ³ª¿ÔÀ¸´Ï, ÀÚÁÖ »ç¿ëÇÏÁö´Â ¾ÊÁö¸¸ ÇØ´ç ¼¼¸¶Æ÷¾îÀÇ Á¤º¸¸¦ ¾ò°í ¼³Á¤ÇÏ´Â µ¥ »ç¿ëµÇ´Â semid_ds ±¸Á¶Ã¼¿Í IPC_STAT, IPC_SET ¿¡ ´ëÇؼ­ ¾Ë¾Æº¾½Ã´Ù. /* ¼¼¸¶Æ÷¾î ÁýÇÕ Áß °¢°¢ÀÇ ¼¼¸¶Æ÷¾î semid µ¥ÀÌÅÍ ±¸Á¶Ã¼ */ struct semid_ds { struct ipc_perm sem_perm; /* permissions .. see ipc.h */ time_t sem_otime; /* last semop time */ time_t sem_ctime; /* last change time */ struct sem *sem_base; /* ptr to first semaphore in array */ struct sem_queue *sem_pending; /* pending operations to be processed */ struct sem_queue **sem_pending_last; /* last pending operation */ struct sem_undo *undo; /* undo requests on this array */ ushort sem_nsems; /* no. of semaphores in array */ }; °£´ÜÇÑ ¼³¸íÀÌ ¿·¿¡ ÁÖ¼®À¸·Î µÇ¾î ÀÖÀ¸´Ï ¹«½¼ ¶æÀÎÁö´Â ´ëÃæ ¾Æ½Ç °ÍÀÔ´Ï´Ù. IPC_STAT ´Â ½Äº°ÀÚ·Î ÁöÁ¤µÈ ÇØ´ç ¼¼¸¶Æ÷¿¡ ´ëÇÑ Á¤º¸¸¦ arg.buf ·Î º¹»ç¸¦ ÇÕ´Ï´Ù. IPC_SET Àº arg.buf ¿¡ ¼³Á¤µÈ shmid_ds ±¸Á¶Ã¼ÀÇ °ªÀ» ½Äº°ÀÚ·Î ÁöÁ¤µÈ ÇØ´ç ¼¼¸¶ Æ÷¾îÀÇ Á¤º¸·Î º¹»ç¸¦ ÇÕ´Ï´Ù. ÁÖ·Î »ç¿ëµÉ ¶§´Â ÀÌ¹Ì ¸¸µé¾îÁø ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ Á¢±Ù±ÇÇÑÀ» ¼öÁ¤ÇÑ´Ù´øÁö uid, gid µîÀ» ¼öÁ¤ÇÒ ¶§ ÀÔ´Ï´Ù. ½ÇÁ¦·Î´Â ¾î¶»°Ô »ç¿ëÇÏ´Â Áö »ìÆ캼±î¿ä? /* ¼¼¸¶Æ÷¾îÀÇ °ªÀ» ÃʱâÈ­ ÇÒ °æ¿ì */ union semun arg; arg.val = 1; semctl(semid, 0, SETVAL, arg); semun º¯¼ö·Î arg ¸¦ Çϳª ¼±¾ðÇÏ°í, arg.val À» ¸ÕÀú 1·Î ¼³Á¤ÇÑ ´ÙÀ½, semctlÀ» arg ¸Å°³º¯¼ö¿Í SETVAL¸¦ »ç¿ëÇÏ¿© È£ÃâÇϸé, semid ½Äº°ÀÚ·Î ÂüÁ¶ÇÏ´Â ¼¼¸¶Æ÷¾îÀÇ °ªÀ» 1·Î ÃʱâÈ­ ÇÏ°Ô µË´Ï´Ù. /* ¼¼¸¶Æ÷¾î¸¦ Á¦°ÅÇÏ´Â °æ¿ì */ union semun arg; semctl(semid, 0, IPC_RMID, arg); semid ¿Í °ü·ÃµÇ´Â ¼¼¸¶Æ÷¾î¸¦ Á¦°ÅÇÏ°Ô µË´Ï´Ù. semctl Àº ½ÇÆнÿ¡´Â -1À» µ¹·ÁÁÖ¸ç, ¼º°øÇßÀ» °æ¿ì¿¡´Â cmd ¿¡ µû¶ó À½¼ö°¡ ¾Æ´Ñ ¼ö¸¦ µ¹·ÁÁÝ´Ï´Ù. ¤§. semop int semop ( int semid, struct sembuf *sops, unsigned nsops); semop ´Â ¼¼¸¶Æ÷¾î¸¦ ½ÇÁúÀûÀ¸·Î µ¿ÀÛ½ÃÅ°´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. semid ´Â ¸¶Âù°¡Áö·Î semget ¿¡¼­ µ¹·ÁÁØ ¼¼¸¶Æ÷¾î ½Äº°ÀÚÀÔ´Ï´Ù. sembuf ´Â ´ÙÀ½°ú °°Àº ±¸Á¶Ã¼Àε¥ semop ¿¡¼­ ÇÙ½ÉÀÔ´Ï´Ù. /* semop system calls takes an array of these. */ struct sembuf { ushort sem_num; /* semaphore index in array */ short sem_op; /* semaphore operation */ short sem_flg; /* operation flags */ }; semop ½Ã½ºÅÛ È£ÃâÀº sembuf ÀÇ ¹è¿­À» ÃëÇÏ°Ô µÇ¸ç, µû¶ó¼­ ÀϹÝÀûÀ¸·Î ÇÊ¿äÇÑ ¼¼¸¶Æ÷¾î ¹è¿­ÀÇ Å©±â¸¸Å­ ¼³Á¤ÇÏ°Ô µË´Ï´Ù. ¿©±â¼­´Â ÇϳªÀÇ ¼¼¸¶Æ÷¾î¸¸À» »ç¿ë ÇÏ´Â °ü°è·Î ¹è¿­·Î ¼±¾ðÇÏÁö ¾Ê°í ÇϳªÀÇ º¯¼ö·Î ¼±¾ðÇÕ´Ï´Ù. sem_num Àº ¹è¿­¿¡¼­ ¼¼¸¶Æ÷¾îÀÇ À妽º¸¦ ³ªÅ¸³À´Ï´Ù. (¹°·Ð 0ºÎÅÍ ½ÃÀÛÇÕ´Ï´Ù.) sem_op ´Â ÇØ´ç ¼¼¸¶Æ÷¾î º¯¼ö¿¡ ´õÇÏ°Ô µÉ °ªÀÔ´Ï´Ù. º¸Åë '-1' ·Î ¸¹ÀÌ »ç¿ëÇÏ°Ô µË´Ï´Ù. ¼¼¸¶Æ÷¾îÀÇ °ªÀ» À§¿¡¼­ 1·Î ÃʱâÈ­ Çϸé, semop ÇÔ¼ö´Â ¼öÇàÇϸ鼭 ÀÌ °ª ¿¡ sem_op ('-1')À» ´õÇÏ°Ô µÇ¾î °á·ÐÀûÀ¸·Î 0À¸·Î ¸¸µé°Ô µÇ¸ç, ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ÀӰ迵¿ª ÁøÀÔÀ» ¸·°Ô µË´Ï´Ù. sem_flg ´Â semopÀÇ ¼öÇàÀ» Á¦¾îÇÕ´Ï´Ù. sem_flg ¿¡ ¿Ã ¼ö ÀÖ´Â °ªÀº IPC_NOWAIT ¿Í SEM_UNDO °¡ °¡´ÉÇÕ´Ï´Ù. IPC_NOWAIT ´Â ¼¼¸¶Æ÷¾îÀÇ °ªÀÌ 0ÀÏ °æ¿ì, ÀӰ迵¿ª ¿¡¼­ ±â´Ù¸®Áö ¾Ê°í Áï°¢ ¸®ÅÏÇÕ´Ï´Ù. SEM_UNDO µµ º¸Åë ¸¹ÀÌ »ç¿ëÇÏ´Â µ¥, ÀÌ°Í Àº ½Ã½ºÅÛÀÌ ÇöÀç ÇÁ·Î¼¼½ºÀÇ ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ µ¿ÀÛÀ» ÃßÀûÇÏ¿© ÇÁ·Î¼¼½º°¡ ºñÁ¤»ó ÀûÀÎ Á¾·á¸¦ ¼öÇàÇÏ¿´À» °æ¿ì¿¡ ¼¼¸¶Æ÷¾îÀÇ °ªÀÌ ºñÁ¤»óÀûÀ¸·Î µÇ´Â °ÍÀ» ¸·±âÀ§ÇØ Áö±Ý±îÁö ¼öÇàÇÑ ÇÁ·Î¼¼½ºÀÇ ÀÛ¾÷À» ¸ðµÎ Ãë¼Ò½ÃÅ°´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. °¡·É ÇÁ·Î¼¼½º°¡ ¼¼¸¶Æ÷¾îÀÇ °ªÀ» 0À¸·Î ¼³Á¤ÇÏ°í ³­ ÈÄ¿¡ ÀӰ迵¿ªÀ» ¼öÇàÇÏ´øÁß, ¾î¶°ÇÑ ÀÌÀ¯·Î ºñÁ¤»óÀûÀ¸·Î ÁߴܵǾúÀ» °æ¿ì¿¡, ÀÌ ÇÁ·Î¼¼½º°¡ ¼öÇàÇÑ ÀÌÀüÀÇ ÀÛ ¾÷À» ¿ø»óº¹±¸ÇÏ¿© ¼¼¸¶Æ÷¾îÀÇ °ªÀ» 1·Î ´Ù½Ã ¼³Á¤µÇÁö ¾ÊÀ¸¸é, ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ ¿µ¿øÈ÷ ÀӰ迵¿ª¿¡ µé¾î¿ÀÁö ¸øÇÏ´Â ¼ö°¡ »ý±æ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·² °æ¿ì¸¦ ´ëºñÇؼ­ SEM_UNDO ¸¦ »ç¿ëÇÕ´Ï´Ù. semop ÇÔ¼ö¿¡¼­ µÎ¹ø° ¸Å°³º¯¼öÀÎ sops ´Â °ªÀÌ ¼³Á¤µÈ sembuf ¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÔ´Ï ´Ù. nsops ´Â semop °¡ ÀÛ¾÷ÇÒ ¼¼¸¶Æ÷¾î ¹è¿­ÀÇ °¹¼öÀÔ´Ï´Ù. ¿©±â¿¡¼­´Â Çϳª »Ó À̹ǷΠ1·Î ¼³Á¤ÇÕ´Ï´Ù. semop ÇÔ¼ö´Â º¸Åë ÀӰ迵¿ª¿¡¼­ÀÇ p ¿Í v ¿¡¼­ ¼¼¸¶Æ÷¾îÀÇ °ªÀ» º¯°æ½ÃÅ°´Â ¿ëµµ·Î »ç¿ëµË´Ï´Ù. À§¿¡¼­ »ìÆ캻 ÀӰ迵¿ª¿¡¼­ÀÇ ÀÇ»ç Äڵ带 ´Ù½Ã »ìÆì º¾½Ã´Ù. semaphore sv = 1; loop forever { p(sv); critical code section; v(sv); non-critical code section; } ¿©±â¿¡¼­ p ¿Í v ´Â ½ÇÁ¦·Î ´ÙÀ½°ú °°ÀÌ ±¸ÇöµË´Ï´Ù. ¹°·Ð, ¼¼¸¶Æ÷¾î ¹è¿­ÀÌ ¾Æ´Ñ ÇϳªÀÇ ¼¼¸¶Æ÷¾î ÀÏ °æ¿ìÀÔ´Ï´Ù. int p(int semid) { struct sembuf p_buf; p_buf.sem_num = 0; /* 0¹ø° ¼¼¸¶Æ÷¾î */ p_buf.sem_op = -1; /* sv + (-1) */ p_buf.sem_flg = SEM_UNDO; if (semop(semid, &p_buf, 1) == -1) { perror("p(semid) failed\n"); return 0; } return 1; } int v(int semid) { struct sembuf v_buf; v_buf.sem_num = 0; /* 0¹ø° ¼¼¸¶Æ÷¾î */ v_buf.sem_op = 1; /* sv + 1 */ v_buf.sem_flg = SEM_UNDO; if (semop(semid, &v_buf, 1) == -1) { perror("v(semid) failed\n"); return 0; } return 1; } ÀÌÁ¦, ¼¼¸¶Æ÷¾î ÇÔ¼ö¿¡ ´ëÇÑ ³»¿ëÀº ¸ðµÎ »ìÆ캸¾Ò½À´Ï´Ù. ÀÌ Á¤µµ¸é ½ÇÁ¦ »ç¿ë½Ã¿¡ º° ¹«¸®´Â ¾øÀ» °ÍÀÌ¶ó º¸¿©Áö¸ç ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº man ÆäÀÌÁö¸¦ Âü°íÇϽñ⠹ٶø´Ï ´Ù. ÀÌÁ¦ µÎ°³ÀÇ ¿¹Á¦ ¼Ò½º¸¦ ¸¸µé¾î º¸°Ú½À´Ï´Ù. ù¹ø° °ÍÀº ¼¼¸¶Æ÷¾î¸¦ °£´ÜÈ÷ Å×½ºÆ® ÇÏ´Â °ÍÀÌ°í, µÎ¹ø° °ÍÀº ½ÇÁ¦ ÀÀ¿ë ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¶§ÀÇ ¼¼¸¶Æ÷¾î »ç¿ë¹æ¹ý¿¡ ´ëÇؼ­ °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸¸é¼­ ¸»¾¸µå¸®°Ú½À´Ï´Ù. ´Ù. ½ÇÁ¦ ¿¹Á¦ ¼Ò½º - ¿Í~ ³Ê¹« ½±´Ù~ :-) ---------------------------------------------------------------------------- /* ¼¼¸¶Æ÷¾î Å×½ºÆ® ¿¹Á¦ - sem1.c */ #include #include #include #include #include #include #define SEMKEY 0x100 /* * ¼¼¸¶Æ÷¾î¸¦ »ý¼ºÇϰųª ½Äº°ÀÚ¸¦ ¾ò´Â´Ù. * * ¸Å°³º¯¼ö : semkey - »ý¼ºÇϰųª ½Äº°ÀÚ¸¦ ¾òÀ» ¼¼¸¶Æ÷¾î¿¡ »ç¿ëÇÏ´Â Å°°ª * ¹Ýȯ°ª : ¿¡·¯½Ã -1, ¼º°ø½Ã ÇØ´ç ¼¼¸¶Æ÷¾îÀÇ ½Äº°ÀÚ * */ int initsem(int semkey) { int semid, status = 0; union semun sem_union; if((semid = semget(semkey, 1, 0666 | IPC_CREAT | IPC_EXCL)) == -1) { if(errno == EEXIST) { semid = semget(semkey, 1, 0); /* ÀÌ¹Ì Á¸ÀçÇÒ °æ¿ì¿¡ ½Äº°ÀÚ¸¸ ¾ò´Â´Ù. */ } } else { sem_union.val = 1; /* ¼¼¸¶Æ÷¾î¸¦ »ý¼ºÇÑ ÇÁ·Î¼¼½º¸¸ ±× °ªÀ» ÃʱâÈ­ */ status = semctl(semid, 0, SETVAL, sem_union); } if (semid == -1 || status == -1) { perror("initsem"); return -1; } /* ½Äº°ÀÚ°¡ 0ÀÌ µÉ ¼ö ÀÖÀ¸¹Ç·Î ¿¡·¯½Ã 0À» ¹ÝȯÇÏÁö ¾Êµµ·Ï ÁÖÀÇ */ return semid; } int p(int semid) { struct sembuf p_buf; p_buf.sem_num = 0; p_buf.sem_op = -1; p_buf.sem_flg = SEM_UNDO; if(semop(semid, &p_buf, 1) == -1) { perror("p(semid)"); return -1; } return 0; } int v(int semid) { struct sembuf v_buf; v_buf.sem_num = 0; v_buf.sem_op = 1; v_buf.sem_flg = SEM_UNDO; if(semop(semid, &v_buf, 1) == -1) { perror("v(semid)"); return -1; } return 0; } void handlesem(int semkey) { int semid, pid = getpid(); if((semid = initsem(semkey)) < 0) exit(1); printf("\nprocess %d before critical section\n", pid); p(semid); printf("process %d in critical section\n", pid); sleep(2); printf("process %d leaving critical section\n", pid); v(semid); printf("process %d exiting\n", pid); exit(0); } void main() { if(fork() == 0) handlesem(SEMKEY); if(fork() == 0) handlesem(SEMKEY); if(fork() == 0) handlesem(SEMKEY); } ---------------------------------------------------------------------------- À§ÀÇ ¼Ò½º¿¡¼­ initsem Àº ¼¼¸¶Æ÷¾î¸¦ ÃʱâÈ­ ÇÏ°í, p ¿Í v ÇÔ¼ö´Â ¼¼¸¶Æ÷¾î ¿¬»êÀ» ¼öÇàÇÕ´Ï´Ù. ÀÌ ¼¼°³ÀÇ ÇÔ¼ö´Â ¼­·Î µ¶¸³ÀûÀ¸·Î ¼³°èµÇ¾î ÀÖÀ¸¹Ç·Î ÀÌÈÄ¿¡´Â ±×³É ÇÁ·Î¼¼½º µ¿±âÈ­°¡ ÇÊ¿äÇÑ ºÎºÐ¿¡ °¡Á®´Ù ¾²½Ã¸é µÇ°Ú½À´Ï´Ù. À§¿¡¼­ÀÇ handlesem °ú °°Àº ÇÔ¼ö¿¡¼­´Â semkey ÀÇ °ªÀ» °¡Áö°í initsemÀ» ½ÇÇà½ÃÄÑ semid ¸¦ ¾ò°í, ÀÌ ÈÄ¿¡ p ¿Í v ÇÔ¼ö¸¦ ¼öÇàÇÏ°í ÀÖ½À´Ï´Ù. ½ÇÁ¦ÀÇ Äڵ忡¼­µµ ÀÌ¿Í ºñ½ÁÇÑ ¸ð¾çÀ¸·Î »ç¿ëÀÌ µÉ °ÍÀÔ´Ï´Ù. main ¿¡¼­´Â ¼¼°³ÀÇ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦»ý¼ºÇÏ¿© µ¿ÀÏÇÑ handlesem ÇÔ¼ö¸¦ µ¿ÀÏÇÑ ¼¼¸¶Æ÷¾î Å°¸¦ »ç¿ëÇÏ¿© ½ÇÇà½ÃÅ°°í ÀÖ½À´Ï´Ù. ÇÏÁö¸¸, fork ·Î »ý¼ºµÈ ÀÚ½Ä ÇÁ·Î¼¼½º´Â ºñ·Ï ÀÌÈÄÀÇ µ¿ÀÏÇÑ Äڵ带 ¼öÇàÇÏÁö¸¸ °¢ÀÚÀÇ µ¥ ÀÌÅÍ ¿µ¿ªÀº °¢ÀÚ °¡Áö¹Ç·Î (ºÎ¸ð ÇÁ·Î¼¼½º¿¡¼­ º¹»çÇؼ­ »ç¿ëÇϹǷÎ) handlesem¿¡ ¼­ ¾î¶² Áö¿ªÀûÀÎ(!) º¯¼ö¸¦ »ç¿ëÇÏ¿© ÇÁ·Î¼¼½ºÀÇ ½ÇÇàȽ¼ö¸¦ ±â·ÏÇÑ´Ù´øÁö ÇÏ´Â °Í Àº ºÒ°¡´ÉÇÔÀ» ¾Ë¾ÆµÎ½Ã±â ¹Ù¶ø´Ï´Ù. ÀÌÁ¦, ÄÄÆÄÀÏÀ» Çؼ­ ½ÇÇàÀ» ½ÃÄѺ¾½Ã´Ù. $ gcc -o sem1 sem1.c $ ./sem1 process 257 before critical section process 257 in critical section process 258 before critical section process 259 before critical section process 257 leaving critical section process 257 exiting process 258 in critical section process 258 leaving critical section process 258 exiting process 259 in critical section process 259 leaving critical section process 259 exiting $ ¿ª½Ã, ¿ì¸®°¡ ¿¹»óÇÏ´ø µ¥·Î ÀӰ迵¿ªÀº Çѹø¿¡ ÇϳªÀÇ ÇÁ·Î¼¼½º¸¸ÀÌ ¼öÇàÀ» ÇÏ°í ÀÖ ½À´Ï´Ù. (Àâ´ã: 1³â Âë Àü,À§¿Í À¯»çÇÑ Äڵ带 °¡Áö°í Å×½ºÆ®¸¦ ÇÑÀûÀÌ ÀÖ¾ú´Â µ¥, ÀÌ»óÇÏ °Ô Á¦´ë·Î ¿øÇÏ´Â °á°ú°¡ ³ªÅ¸³ªÁö ¾Ê¾Æ¼­ ¼ÓÀ» Å¿î ÀûÀÌ ÀÖ¾ú½À´Ï´Ù. ¾Æ¹«¸® ¸Ó ¸®¸¦ ±¼·ÁºÁµµ Ã¥ÀÇ ¿¹Á¦¿Í ²À °°ÀÌ ÀÛ¼ºÀ» Çß´Â µ¥, Ã¥´ë·Î µÇÁö ¾Ê´Â °æ¿ì¿´½À´Ï ´Ù. :( - ÀÌ·² ¶§´Â Á¤¸» Ȳ´çÇÕ´Ï´Ù. - ±×·¡¼­ 'Ã¥ÀÌ ¿À·¡µÇ¾î¼­ ¹º°¡°¡ ¹Ù²î¾ú³ª' ÇÏ´Â ÀDZ¸½É°ú ÇÔ²² 'Linux ¿¡ ¹º°¡ ¹® Á¦°¡ ÀÖÀ»°Å¾ß' Çϸ鼭 Á˾ø´Â Linux ½Ã½ºÅÛ¸¸ ÀǽÉÇϸ鼭 1³â µ¿¾È °íÅëÀ» ¹Þ¾Æ¿Ô ½À´Ï´Ù. - Linux ½Ã½ºÅÛ¿¡¼­ ¹º°¡ ¹Ù¶ó´Â ¹Ù´ë·Î Á¦´ë·Î ¾ÈµÉ ¶§ ½Ã½ºÅÛÀ» ÀÇ½É ÇÏ´Â °ÍÀº ºñ´Ü Àú »Ó¸¸Àº ¾Æ´Ñ °Í °°´õ±º¿ä. :) - ±×·¯´Ù°¡ ¾ó¸¶Àü¿¡ 'Beginning Linux Programming' ÀÇ ¼¼¸¶Æ÷¾î ¿¹Á¦¸¦ ½ÇÇà½ÃÄѺ¸ ´Ï À¢°É~ Á¦´ë·Î µÇ´Â °Ô ¾Æ´Ï°Ú½À´Ï±î? ÀÌ°Ô À¢ Á¶È­ÀÏ ±î ½Í¾î¼­ À§ÀÇ ¼Ò½º¸¦ ÂùÂùÀÌ ¶â¾îº¸´Ï..¾Æ»Ô½Î...!! ¿øÀÎÀº ÄÚµù¿¡·¯¿¡ ÀÖ¾úÁö¿ä. ±× Ȳ´çÇÔÀ̶õ.. Á¤¸» ¿ï°í ½Í´õ±º¿ä.. -.- initsem ¿¡¼­ '}', '{' ¸¦ À߸ø »ç¿ëÇÏ¿© ¼¼¸¶Æ÷¾î °ªÀ» ÃʱâÈ­ ½ÃÅ°´Â semctl ÇÔ ¼ö°¡ ½ÇÇàÀÌ µÇÁö ¾ÊÀº °Å¿´½À´Ï´Ù. ±×¶§¿¡´Â ÇÑÁÙÂ¥¸® Äڵ忡´Â ºí·°°ýÈ£¸¦ »ý·« ÇÏ´ø ½À°üÀÌ ÀÖ¾ú´Â µ¥, ÀÌ°Ô È­¸¦ ºÒ·¶Áö¿ä. ÀÌ·± ÀÌÀ¯·Î ÇÁ·Î¼¼½ºµéÀÌ ÀӰ迵¿ª ¿¡ Àý´ë·Î µé¾î°¡Áö ¾Ê´Â »çÅ°¡ ¹ß»ýÀ» Çß´õ·¨½À´Ï´Ù. 1³âµ¿¾È °í»ýÇϸ鼭 »ý°¢ÇÑ °á·ÐÀº '¿¹Á¦¼Ò½º¸¦ ¾î¶°ÇÑ ¹æ½ÄÀ¸·Î´ø Á¦°øÀ» ÇÏÁö ¾Ê ´Â Ã¥Àº »çÁö¸»ÀÚ' ÇÏ´Â °Å¿´½À´Ï´Ù. ±×¶§ ¿¹Á¦ ¼Ò½º¸¸ ¾î¶»°Ô ±¸ÇÒ ¼ö ÀÖ¾ú¾îµµ ÀÌ·± ºÀº¯Àº ´çÇÏÁö ¾Ê¾ÒÀ» °Ì´Ï´Ù. ¾Æ¿ï·¯ È¥ÀÚ¼­ °øºÎÇϽô ºÐµéÀº ÄÚµù»ó¿¡ ¾î¶² ¹®Á¦°¡ »ý°åÀ» ¶§ µµ¿òÀ» ¿äûÇÒ ¼ö ÀÖ´Â µµ¿ì¹Ì(?)¸¦ ÇѺР²¿¼ÅµÎ½Ê½Ã¿ä. °ñÄ¡¾ÆÇ ÇÁ·Î±×·¡¹Ö °ü·Ã Áú¹®Àº °Ô½ÃÆÇ¿¡ ¿Ã·Áµµ Àß ´äº¯ÀÌ ¾ø½À´Ï´Ù. -.- ) (°è¼Ó..) ¹ø È£ : 643 °Ô½ÃÀÚ : Çѵ¿ÈÆ (ddoch ) µî·ÏÀÏ : 1997-07-04 07:23 Á¦ ¸ñ : [°­ÁÂ] ½Ã½ºÅÛ V IPC - ¼¼¸¶Æ÷¾î2 (3) À§ÀÇ ¿¹Á¦¿¡¼­ ¼¼¸¶Æ÷¾î¸¦ ¸¸µé¾î ³õ±â¸¸ ÇÏ°í Á¦°Å¸¦ ÇÏÁö ¾Ê¾Ò½À´Ï´Ù. ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ°í³­ ÀÌÈĺÎÅÍ ½Ã½ºÅÛÀÌ ³¡³¯ ¶§ ±îÁö ½ÇÇàµÇ´Â ÇÁ·Î±×·¥À̰ųª, ¶Ç´Â Áß°£ Áß°£¿¡ ¿©·¯¹ø ½ÇÇàµÇ´Â ÇÁ·Î±×·¥ÀÌ¸é ¸ð¸£°ÚÀ¸³ª, ±×·¸Áö ¾ÊÀº °æ¿ì¿¡´Â ¼¼¸¶Æ÷¾î ¸¦ Á¦°ÅÇØÁÖ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. Áï, ´õÀÌ»ó »ç¿ëÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸é ½Ã½ºÅÛ ÀÚ¿øÀ» Àý ¾àÇÑ´Ù´Â Â÷¿ø¿¡¼­ ¾ø¾ÖÁÖ´Â °ÍÀÌÁö¿ä. º¸Åë ÇÁ·Î±×·¥ ³»¿¡¼­ ¼¼¸¶Æ÷¾î°¡ ´õÀÌ»ó ÇÊ¿ä¾ø´Ù°í ÆÇ´ÜÀ» ³»¸± ¸¸ÇÑ ¾î¶² Á¶°ÇÀÌ ÂüÀΰ¡¸¦ °Ë»çÇؼ­ ¾ø¾Ö´Â ¹æ¹ýÀÌ Á¦ÀÏ ÆíÇÏ°Ú½À´Ï´Ù¸¸ ±×·¸Áö ¾Ê°í,ÇÁ·Î±×·¥À» ½ÇÇà½Ãų ¶§ ȯ°æº¯¼ö¸¦ È®ÀÎÇϰųª ÀÎÀÚ ¸¦ Á־ ó¸®ÇÏ´Â ¹æ¹ýµµ ÀÖ½À´Ï´Ù. ¿©±â¼­´Â ¸ÕÀú IPC °¡ Á¦°øÇÏ´Â ¸í·ÉÇà¿¡¼­ ½ÇÇàÇÒ ¼ö ÀÖ´Â ¸í·É¾î¸¦ »ìÆ캸°Ú½À´Ï´Ù. À§¿¡¼­ ³²°Ô µÈ ¼¼¸¶Æ÷¾î¸¦ ¸ÕÀú »ìÆ캼±î¿ä? $ ipcs -s ------ Semaphore Arrays -------- semid owner perms nsems status 512 host 666 1 ¼¼¸¶Æ÷¾î ½Äº°ÀÚ°¡ 512 ÀÌ°í Á¢±Ù±ÇÇÑÀÌ '666' ÀÎ ¼¼¸¶Æ÷¾î°¡ Çϳª ÀÖ±º¿ä. ÀÌ ³à¼®ÀÌ À§ÀÇ Äڵ忡¼­ÀÇ ÀӰ迵¿ª¿¡¼­ Æļö²ÛÀÌ µÇ¾ú´ø ³ðÀÔ´Ï´Ù. $ ipcs ------ Shared Memory Segments -------- shmid owner perms bytes nattch status ------ Semaphore Arrays -------- semid owner perms nsems status 512 host 666 1 ------ Message Queues -------- msqid owner perms used-bytes messages 'ipcs' ´Â ÇöÀç ½Ã½ºÅÛ¿¡ ÀÖ´Â °¢°¢ÀÇ IPC ¼³ºñÀÎ '¼¼¸¶Æ÷¾î', '°øÀ¯¸Þ¸ð¸®', '¸Þ½ÃÁö Å¥' ¿¡ ´ëÇÑ Àüü Á¤º¸¸¦ Ãâ·ÂÇÕ´Ï´Ù. ¼¼¸¶Æ÷¾î¸¸º¸·Á¸é, '-s', °øÀ¯¸Þ¸ð¸®´Â '-m', ¸Þ½ÃÁö Å¥´Â '-q' ¸¦ »ç¿ëÇÕ´Ï´Ù. IPC ÀÇ ¸í·ÉÇà ÇÁ·Î±×·¥Àº ÇØ´ç IPC ¼³ºñ¸¦ »èÁ¦ÇÒ ¼ö ÀÖ½À´Ï´Ù. Á» ºÒ½ÖÇϱä ÇÏÁö ¸¸ À§ÀÇ ¼¼¸¶Æ÷¾î¸¦ ¾ø¾Öº¼±î¿ä? $ ipcrm sem 512 resource deleted IPC ¼³ºñ¸¦ »èÁ¦ÇÏ´Â ¸í·ÉÀº 'ipcrm' ÀÌ°í, ¼¼¸¶Æ÷¾î´Â 'sem', °øÀ¯¸Þ¸ð¸®´Â 'shm', ¸Þ½ÃÁö Å¥´Â 'msg' ¸¦ °¢°¢ »ç¿ëÇÕ´Ï´Ù. ´ç¿¬È÷ ¸¶Áö¸·¿¡ ÇØ´ç ½Äº°ÀÚ¸¦ ¸í½ÃÇØ¾ß ÇÕ´Ï´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº 'ipcs -h' ³ª 'ipcrm -h' ¸¦ »ç¿ëÇϰųª 'man ipcs', 'man ipcrm' Çϼż­ Âü°íÇϽñ⠹ٶø´Ï´Ù. %%% µµ´ëü ³ªÀÇ ÇÁ·Î±×·¥¿¡¼­ ÀӰ迵¿ªÀº ¾îµðÀΰ¡? %%% ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥ÀÌ ´ÙÁß ÇÁ·Î¼¼½º, ´ÙÁß À¯Àú ȯ°æ¿¡¼­ µ¹¾Æ°¡µµ·Ï ¸¸µé¾îÁ® ÀÖ´Ù ¸é (Linux & Unix ¿¡¼­´Â ±âº» ȯ°æÀÌÁÒ..) ¿©·¯°÷ÀÌ ÀӰ迵¿ªÀÌ µÉ ¼ö ÀÖ½À´Ï´Ù. ¿©·¯ ÇÁ·Î¼¼½º°¡ ÇϳªÀÇ ÆÄÀÏ¿¡ ¾²±âÀ§ÇØ Á¢±ÙÇÒ ¶§, ÆÄÀÏÀ» ¿©´Â °÷ºÎÅÍ ÆÄÀÏÀ» ´Ý ´Â °÷±îÁö°¡ ÀӰ迵¿ªÀÌ µÉ ¼ö ÀÖ½À´Ï´Ù. ¶Ç´Â ÇØ´ç ½Ã½ºÅÛ¿¡¼­ ÇÑÁ¤µÈ ÀÚ¿ø¿¡ ±× ÀÌ»óÀÇ ÇÁ·Î¼¼½º°¡ »ç¿ëÀ» ¿øÇÒ ¶§ ÀӰ迵¿ªÀÌ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù. ½ÇÁ¦¿¡ À־ ÀӰ迵¿ªÀÇ ÆǺ°±âÁØÀº ÀÚ½ÅÀÇ ÇÁ·Î±×·¥¿¡¼­ ¿©·¯ ÇÁ·Î¼¼½º°¡µ¿½Ã¿¡ ½ÇÇàµÇ¾î¼­´Â ¹®Á¦°¡ »ý±æ ¼ö ÀÖ´Â ºÎÀ§°¡ µÉ °ÍÀÔ´Ï´Ù. µ¿½Ã¿¡ ¿©·¯ ÇÁ·Î¼¼½º°¡ Àб⸸À» ¼öÇà ÇÏ´Â °ÍÀº º° ¹®Á¦°¡ µÇÁö ¾Ê½À´Ï´Ù. ÀÌÁ¦ ½ÇÁ¦ÀûÀ¸·Î ÀÀ¿ë ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ °æ¿ì¿¡ ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö¸¦ »ìÆ캼±î¿ä? ´Ù¾çÇÑ ºÐ¾ß¿¡¼­ ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖ°ÚÁö¸¸, ¿©±â¼­´Â °£´ÜÇÏ°Ô ¾î¶² ÇÁ·Î±×·¥ ÀÇ ÀϺκÐÀ¸·Î µé¾î°¥ ¼ö ÀÖ´Â, ÇØ´ç ÇÁ·Î¼¼½ºÀÇ ·Î±ä ÀÏÁö¸¦ ±â·ÏÇÏ´Â ·çƾÀ» ¼¼ ¸¶Æ÷¾î¸¦ »ç¿ëÇÏ¿© ¸¸µé¾î º¸°Ú½À´Ï´Ù. ¸ÕÀú, À§ÀÇ initsem, p, v ·çƾÀ» Àç»ç¿ë°¡´ÉÇϵµ·Ï ´Ù¸¥ ÆÄÀÏ¿¡ ´ã½À´Ï´Ù. ÀÌÈÄ¿¡ ÆíÇÏ°Ô»ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¸¸µé¾î º¼±î¿ä? ¿©±â¿¡ ¼¼¸¶Æ÷¾î¸¦ Á¦°ÅÇÏ´Â delsem ÇÔ¼ö ¸¦ Ãß°¡ÇÕ´Ï´Ù. ÀÌ ÆÄÀÏÀº ipc_sem.c ¶ó°í ÇÏ°Ú½À´Ï´Ù. ---------------------------------------------------------------------------- /* ipc_sem.c : Àç»ç¿ë°¡´ÉÇÑ ¼¼¸¶Æ÷¾î ·çƾ */ #include #include #include #include #include #include int initsem(int semkey); int delsem(int semid); int p(int semid); int v(int semid); int initsem(int semkey) { intsemid, status = 0; union semun sem_union; if((semid = semget(semkey, 1, 0666 | IPC_CREAT | IPC_EXCL)) == -1) { if(errno == EEXIST) { semid = semget(semkey, 1, 0); } } else { sem_union.val = 1; status = semctl(semid, 0, SETVAL, sem_union); } if (semid == -1 || status == -1) { perror("initsem"); return -1; } return semid; } int delsem(int semid) { union semun sem_union; if (semctl(semid, 0, IPC_RMID, sem_union) == -1) { perror("semaphore delete"); return -1; } return 0; } int p(int semid) { struct sembuf p_buf; p_buf.sem_num = 0; p_buf.sem_op = -1; p_buf.sem_flg = SEM_UNDO; if(semop(semid, &p_buf, 1) == -1) { perror("p(semid)"); return -1; } return 0; } int v(int semid) { struct sembuf v_buf; v_buf.sem_num = 0; v_buf.sem_op = 1; v_buf.sem_flg = SEM_UNDO; if(semop(semid, &v_buf, 1) == -1) { perror("v(semid)"); return -1; } return 0; } ---------------------------------------------------------------------------- ÀÌÁ¦ ¸¸µå´Â ÇÁ·Î±×·¥Àº °£´ÜÇÏ°Ô À§ÀÇ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÏ¿© ÇöÀç ÇÁ·Î¼¼½ºÀÇ ½ÇÇà ½ÃÀ۽ð£°ú Á¾·á½Ã°£À» ±â·ÏÇÏ´Â record.c ÀÔ´Ï´Ù. ---------------------------------------------------------------------------- /* record.c : ÇöÀç ÇÁ·Î¼¼½ºÀÇ ½ÇÇà½Ã°£ ÃøÁ¤ */ #include #include #include #include "ipc_sem.h" #define SEMKEY 0x100 #define RECORD_FILE "record.file" struct reg_list { pid_t pid;/* ÇÁ·Î¼¼½º ¹øÈ£ */ time_t start; /* ÇÁ·Î¼¼½º ½ÇÇà ½ÃÀÛ ½Ã°£ */ time_t end; /* ÇÁ·Î¼¼½º ½ÇÇà Á¾·á ½Ã°£ */ }; struct reg_list reg; void reg_start(); void reg_end(int); void reg_start() { reg.pid = getpid(); /* ÇÁ·Î¼¼½º ¹øÈ£ */ reg.start = time(NULL); /* ÇöÀç ½Ã°£ */ reg.end = (time_t)0; } void reg_end(int sem_delete_flag) { int semid; FILE *fp; if ((semid = initsem(SEMKEY)) < 0) exit(1); reg.end = time(NULL); p(semid); /* ÀӰ迵¿ªÀÇÀÔ±¸*/ if ((fp = fopen(RECORD_FILE, "a+")) == NULL) { perror(RECORD_FILE); return; /* ¾²±â ½ÇÆÐ , SEM_UNDO ·Î ÀÎÇØ ¼¼¸¶Æ÷¾î°ªÀº ¿ø·¡´ë·Î µ¹¾Æ°¨ */ } fwrite(®, sizeof(struct reg_list), 1, fp); fclose(fp); v(semid); if (sem_delete_flag) { /* ¼¼¸¶Æ÷¾î »èÁ¦ Ç÷¡±×°¡ ¼³Á¤µÇ¾ú´Ù¸é Á¦°Å */ delsem(semid); } } void main(int argc, char *argv[]) { reg_start(); sleep(2); /* ½ÇÁ¦¿¡ À־ÀÇ ¾î¶² ÀÛ¾÷ */ if (argc > 1) {/* ¼¼¸¶Æ÷¾î¸¦ Á¶°ÇÀûÀ¸·Î Á¦°Å */ reg_end(1); } else { reg_end(0); } #ifdef DEBUG /* µð¹ö±ë ÄÚµå */ { char tbuf1[20], tbuf2[20]; FILE *fp; if ((fp = fopen(RECORD_FILE, "r")) == NULL) { perror(RECORD_FILE); exit(1); } while (fread(®, sizeof(struct reg_list), 1, fp) == 1) { strftime(tbuf1, 20, "%m/%d %I:%M:%S", localtime(&(reg.start))); strftime(tbuf2, 20, "%m/%d %I:%M:%S", localtime(&(reg.end))); printf("ÇÁ·Î¼¼½º : %5d , ½ÃÀ۽ð£: %s , Á¾·á½Ã°£ : %s\n", reg.pid, tbuf1, tbuf2); } printf("\n"); } #endif } ---------------------------------------------------------------------------- ¿©±â¿¡¼­, '#ifdef DEBUG' ´Â reg_end ÇÔ¼ö°¡ ±â·ÏÇÑ ·¹ÄÚµå ÆÄÀÏÀÇ ³»¿ëÀ» ¾Ë¾Æ º¸±â À§ÇÑ ÄÚµåÀÔ´Ï´Ù. main ¿¡¼­´Â °£´ÜÈ÷ reg_start ¸¦ ¼öÇàÇÏ¿© ½ÃÀÛ ½Ã°£À» reg.start ¿¡ ±â·ÏÇÏ°í, reg_end ¸¦ È£ÃâÇÏ¿© Á¾·á½Ã°£À» ±â·ÏÇÕ´Ï´Ù. ¼¼¸¶Æ÷¾î¸¦ Á¦°ÅÇÏ´Â ¹æ¹ýÀ» Á¦°ø Çϱâ À§ÇÏ¿© main ¿¡¼­ ¸Å°³º¯¼ö°¡ 2°³ ÀÌ»óÀ̸é reg_end ·Î ÇÏ¿©±Ý ¼¼¸¶Æ÷¾î¸¦ »èÁ¦Çϵµ·Ï Áö½ÃÇß½À´Ï´Ù. ÀÌÁ¦ ÄÄÆÄÀÏÇÏ¿© ½ÇÇàÀ» Çغ¼±î¿ä? ÄÄÆÄÀÏÇÒ ¶§ '-DDEBUG' ¿É¼ÇÀ» »ç¿ëÇÏ¿© º¾½Ã´Ù. ---------------------------------------------------------------------------- $ gcc -o record record.c ipc_sem.c -DDEBUG $ ./record ÇÁ·Î¼¼½º : 668 , ½ÃÀ۽ð£ : 07/04 06:50:20 , Á¾·á½Ã°£ : 07/04 06:50:22 $ ipcs -s ------ Semaphore Arrays -------- semid owner perms nsems status 384 host 666 1 $ record 1 ÇÁ·Î¼¼½º : 668 , ½ÃÀ۽ð£ : 07/04 06:50:20 , Á¾·á½Ã°£ : 07/04 06:50:22 ÇÁ·Î¼¼½º : 670 , ½ÃÀ۽ð£ : 07/04 06:50:51 , Á¾·á½Ã°£ : 07/04 06:50:53 $ ipcs -s ------ Semaphore Arrays -------- semid owner perms nsems status $ ---------------------------------------------------------------------------- ¿©±â¼­´Â °£´ÜÈ÷ ½ÇÇุ ½ÃÄѺ¸¾ÒÁö¸¸, ¼¼¸¶Æ÷¾îÀÇ Áø°¡´Â ¿©·¯ ÇÁ·Î¼¼½º°¡ ¿¹Ãø ÇÒ ¼ö ¾ø´Â ½Ã°£¿¡ ½ÇÇàµÉ ¶§ ±× È¿°ú°¡ ÀÖ´Ù´Â »ç½ÇÀ» ¾Ë¾ÆµÎ½Ã±â ¹Ù¶ø´Ï´Ù. À̹ø Àå¿¡¼­´Â ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ ¿©·¯ ÇÔ¼öµéÀ» »ìÆ캸¸é¼­, ¿¹Á¦¸¦ µÎ°³ ¸¸µé¾î º¸ ¾Ò½À´Ï´Ù. ÀÌÁ¦, ´ÙÀ½ Àå¿¡¼­´Â IPC ¼³ºñ¿¡¼­ »©³õÀ» ¼ö ¾ø´Â °øÀ¯ ¸Þ¸ð¸®¿¡ ´ëÇؼ­ ÀÚ¼¼È÷ ¾Ë¾Æº¸°Ú½À´Ï´Ù. (°è¼Ó)