¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 475¹ø Á¦ ¸ñ:[°­ÁÂ1] ½Ã½ºÅÛ V IPC - IPC ÀÇ °³³ä ¿Ã¸°ÀÌ:ddoch (Çѵ¿ÈÆ ) 97/07/06 00:32 ÀÐÀ½:2987 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- -=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ½Ã½ºÅÛ V IPC Åë½Å °­Á -=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ±Û¾´ÀÌ : Çѵ¿ÈÆ ddoch@hitel.kol.co.kr ³¯ Â¥ : 1997.7.3 ÀúÀÛ±Ç : GPL ±âŸ»çÇ× : Áú¹®°ú °ü·ÃµÈ ³»¿ëÀ̳ª ´äº¯À» ¿äÇÏ´Â ³»¿ëÀº ¸ÞÀÏ·Î Àû¾îÁÖÁö ¸¶½Ã°í °ü·Ã ÇÁ·Î±×·¡¹Ö °Ô½ÃÆÇÀ» ÀÌ¿ëÇØ ÁÖ½Ã¸é ¾Æ´Â µ¥ ±îÁö ¼ºÀDz¯ ´äº¯ÇØ µå¸®°Ú½À´Ï´Ù. Âü°íÀÚ·á : Beginning Linux Programming Áß '12Àå ¼¼¸¶Æ÷¾î, °øÀ¯¸Þ¸ð¸®, ¸Þ½ÃÁö Å¥' Advanced Programming in the UNIX Environment Áß IPC ºÎºÐ UNIX ½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö Áß IPC ºÎºÐ Linux IPC °ü·Ã man ÆäÀÌÁö Áغñ»çÇ× : C ¿¡ ´ëÇÑ ±âº»ÀûÀÎ ÀÌÇØ Linux & UNIX ½Ã½ºÅÛ¿¡ ´ëÇÑ Àü¹ÝÀûÀÎ ÀÌÇØ '¾ÈµÇ¸é µÇ°Ô Ç϶ó!'´Â ±º¹Ù¸® Á¤½Å ±Ãµ­ÀÌ¿¡ ¶¡¶ì°¡ ³ªµµ·Ï Áö±ßÀÌ ÄÄ ¾Õ¿¡ ¾É¾Æ ÀÖÀ» ¼ö ÀÖ´Â Á¤½Å ÇÁ·Î±×·¥ ½ÇÇàȯ°æ : Linux ½½·¢¿þ¾î (¾ËÂ¥) 3.1 Ä¿³Î 2.0.0 GCC 2.7.2 ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¸ñ Â÷ ¡à ¡à ¡à ¡à 1. µé¾î°¡´Â ¸» ¡à ¡à 2. IPC °³¿ä ¡à ¡à 3. ¼¼¸¶Æ÷¾î ¡à ¡à 4. °øÀ¯¸Þ¸ð¸® ¡à ¡à 5. ¸Þ½ÃÁö Å¥ ¡à ¡à 6. ³ª¿À´Â ¸» ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à ¡à 1. µé¾î°¡´Â ¸» ¿äÁò µé¾î ³¯¾¾µµ ¹«Ã´ ´õ¿öÁö°í ÀÖ´Â °Í °°½À´Ï´Ù. À۳⠰°À¸¸é ÇÑÂü ¹°³îÀÌÇÑ´Ù °í ¹Ù»Ü ½Ã±âÀε¥, À̹ø ¿©¸§ÀÌ ´Ù°¡±â Àü¿¡ ÀÚ¿¬°ú ÇÔ²² ¸ÚÁø Ãß¾ïÀ» ¸¸µé¾î º¸½É ÀÌ ¾î¶³Áö.. ^^; µÚµ¹¾Æ º¸¸é ¾Æ¸§´Ù¿î ¸®´ª½º.. ÀÌ ¸®´ª½º ¶§¹®¿¡ ¾È±×·¡µµ ´õ¿î ¿Ã ¿©¸§À» ´õ¿í ²úÀÌ°í °è½Å ºÐµéÀÌ ¸¹À¸½Ã´õ±º¿ä. »ç¶û½º·¯¿î ¸¶À½¿¡ »Ç»Ç¶óµµ ÇØÁÖ°í ½Í¾î¼­ ¾È´ÞÀÎ ºÐµé, ¦»ç¶û¿¡ ÁöÃļ­ ¸ð´ÏÅ͸¸ ¶Õ¾îÁ®¶ó ÃÄ´Ùº¸°í °è½Å ºÐµé, »õ¿ÊÀÌ¶óµµ ÀÔÇô¼­ Á» ´õ ¸ÚÀÖ°Ô ¸¸µé¾î ÁÖ·Á°í ¾ø´Â È£ÁÖ¸Ó´Ï ¸ÕÁö¸¦ ÅåÅå Åͽô ºÐµé... ±× ºÐµé°ú ÇÔ²² '°¡ÀÚ. ¾ÆÆ²¶õƼ½º·Î!'°¡ ¾Æ´Ñ '°¡ÀÚ. ¸®´ª½ºÀÇ ½ÉÇØ·Î!'¶ó°í ¿ÜÃÄ º¸°í ½Í±º¿ä. ~.~ À̽ÂÈñ óÀÚ(?) ¸¸Å­À̳ª ½Ã¿øÇÑ IPC ÇÁ·Î±×·¡¹ÖÀ» ¸¶À½²¯ Áñ°Ü º¸½Ê½Ã¿ä. :) 2. IPC ÀÇ °³¿ä IPC ´Â 'InterProcess Communication' ÀÇ Áظ»ÀÔ´Ï´Ù. ¿ì¸®¸»·Î ÇØ¼®Çϸé 'ÇÁ·Î¼¼½º °£ Åë½Å' Á¤µµÀÇ ¶æÀÔ´Ï´Ù. IPC ¸¦ ÀÌ¿ëÇϸé, ÇÁ·Î¼¼½º°£¿¡ ÆíÁö¸¦ ÁÖ°í ¹ÞÀ» ¼öµµ ÀÖ°í, ÀÏÁ¤ÇÑ ¸Þ¸ð¸®¸¦ °øÀ¯ÇÏ¿© ½Ã½ºÅÛÀÇ ¸®¼Ò½º¸¦ Àý¾àÇϰųª ´ë¿ë·®ÀÇ µ¥ÀÌÅ͸¦ ±³È¯ÇÒ ¼öµµ ÀÖÀ¸¸ç, ¸¶Ä¡ ±³Åë½ÅÈ£µî°°ÀÌ ÇÁ·Î¼¼½º³¢¸® »çÀÌÁÁ°Ô Çù·ÂÇÏ¿© ¾î¶°ÇÑ ÀÏÀ» ó¸® ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ´ÙÁß ÇÁ·Î¼¼½º, ´ÙÁß »ç¿ëÀÚ È¯°æ¿¡¼­ÀÇ ÇÁ·Î±×·¡¹Ö »ó ¿¡¼­ ¹ß»ýÇÒ ¼ö ÀÖ´Â ÇÁ·Î¼¼½º µ¿±âÈ­ °°Àº ¹®Á¦Á¡À» ÇØ°áÇϰųª ÇÁ·Î¼¼½º »çÀÌ ÀÇ Åë½Å¿¡ ÁÖ·Î »ç¿ëµÈ´Ù´Â °ÍÀÔ´Ï´Ù. IPC ´Â ½Ã½ºÅÛ V.2 ÆÇ¿¡¼­ Á¦°øµÇ±â ½ÃÀÛÇßÀ¸¸ç, ¾ÆÁÖ À¯¿ëÇÑ ±â´ÉµéÀ» Á¦°øÇϰí ÀÖ ½À´Ï´Ù. ÀϹÝÀûÀ¸·Î IPC »ïÃÑ»ç·Î ºÒ¸®¿ì´Â ¼¼¸¶Æ÷¾î, °øÀ¯¸Þ¸ð¸®, ¸Þ½ÃÁö Å¥°¡ ÀÖ À¸¸ç, Linux ½Ã½ºÅÛ¿¡¼­ IPC ÆÐŰÁö¸¦ ±ò¾Ò´Ù¸é (°ÅÀÇ ´ëºÎºÐÀÇ °æ¿ì¿¡ ¼³Ä¡µÇ¾î ÀÖ À» °Ì´Ï´Ù.) ½Ã½ºÅÛ¿¡¼­ Á¦°øÇÏ´Â IPC °ü·Ã ¼³ºñ¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·³, IPC ¼³ºñÀÇ ÀåÁ¡À» Çѹø »ìÆìº¼±î¿ä? ¹«¾ùÀÌ´øÁö ¸ÕÀú ±¸¹Ì°¡ ´ç°Ü¾ß °ÚÁÒ? °¡. IPC ÀÇ ÀåÁ¡ ¤¡. ´ÙÁß ÇÁ·Î¼¼½º ȯ°æ¿¡¼­ ÇÊ¿äÇÑ ÇÁ·Î¼¼½º µ¿±âÈ­ ¹®Á¦¸¦ ¼Õ½±°Ô ÇØ°áÇÒ ¼ö ÀÖ½À ´Ï´Ù. Linux & UNIX ȯ°æ¿¡¼­ DB °ü·Ã ÀÀ¿ë ÇÁ·Î±×·¥À» °³¹ßÇÒ °æ¿ì°¡ ÁÁÀº ¿¹°¡ µÉ ¼ö ÀÖ°Ú±º¿ä. ¿©·¯¸íÀÇ »ç¿ëÀÚ°¡ µ¿½Ã¿¡ ¾î¶² ÇϳªÀÇ ÆÄÀÏ¿¡ ¾²±â¸¦ ½ÃµµÇÒ °æ¿ì ´Â Á¾Á¾ ÀÖ½À´Ï´Ù. µ¿½Ã¿¡ Àб⠰°Àº °æ¿ì¿¡´Â ¹®Á¦°¡ ¹ß»ýÇÒ ¼ÒÁö°¡ ±×´ÙÁö ¾ø Áö¸¸ ¾²±â½Ã ¿¡´Â Á» ´Ù¸¨´Ï´Ù. ¿¹¸¦ Çϳª µé¾î º¸°Ú½À´Ï´Ù. ¾î¶² ÇϳªÀÇ ÆÄÀÏ¿¡ µ¿½Ã¿¡ µÎ°³ÀÇ ÇÁ·Î¼¼½º°¡ ÆÄÀÏÀÇ ³¡ºÎºÐ¿¡ ³»¿ëÀ» Ãß°¡Çϱâ À§ÇØ Á¢±ÙÀ» ÇÑ´Ù°í °¡Á¤ÇսôÙ. µÎ°³ÀÇ ÇÁ·Î¼¼½º¸¦ P1, P2 ¶ó°í Çϰí, ±âÁ¸ÀÇ ÆÄÀÏÀÇ ³»¿ëÀ» F0, P1 ÀÌ Ãß°¡ÇÏ·Á´Â ³»¿ëÀ» F1, P2 °¡ Ãß°¡ÇÏ·Á´Â ³»¿ëÀ» F2¶ó °í °¡Á¤ÇϰڽÀ´Ï´Ù. µ¿½Ã¿¡ ¾²±â¸¦ ½ÃµµÇÏÁö ¾Ê´Â´Ù¸é, P1 ÀÌ ¸ÕÀú ¾²±â¸¦ Çß À» °æ¿ì¿¡´Â ´ÙÀ½°ú °°Àº Á¤»óÀûÀÎ °á°ú°¡ ³ª¿Ã °ÍÀÔ´Ï´Ù. +------------------+---------+---------+ | F0 | F1 | F2 | +------------------+---------+---------+ [±×¸²1 - ÇϳªÀÇ ÆÄÀÏ¿¡ µÎ°³ÀÇ ÇÁ·Î¼¼½º°¡ ¼ø¼­´ë·Î ¾²±â¸¦ ÇßÀ» °æ¿ì] ±×·¯³ª µ¿½Ã¿¡ ¾²±â¸¦ ½ÃµµÇÒ ¶§¿¡´Â, ¿øÄ¡ ¾Ê´Â °á°ú°¡ ³ª¿Ã ¼öµµ ÀÖ½À´Ï´Ù. P1 ÀÌ ÆÄÀÏÀ» ¿­¾î¼­ ¾²±â Á÷Àü¿¡ P2°¡ ÆÄÀÏÀ» ¿­¾ú´Ù¸é, ÇöÀç P1, P2 °¡ °¡Áö°í ÀÖ´Â ÆÄÀÏÀÇ À̹ÌÁö´Â ²À °°Àº °ÍÀÌ µÉ °ÍÀÔ´Ï´Ù. ÀÌ °æ¿ì¿¡ P1Àº F1 À» F0 µÚ¿¡ Ãß°¡ÇÏ°í ÆÄÀÏÀ» ´Ý½À´Ï´Ù. ±×¸®°í P2µµ F0 µÚ¿¡ F2 ¸¦ Ãß°¡½ÃŰ°í ÆÄÀÏ À» ´ÝÀ» °ÍÀÔ´Ï´Ù. ÀÌ·¸°Ô µÈ´Ù¸é F1, F2 °¡ Â÷·Ê·Î ÆÄÀÏÀÇ µÞºÎºÐ¿¡ Ãß°¡µÇ´Â °ÍÀÌ ¾Æ´Ï¶ó F1, F2 ÀÇ ³»¿ëÀÌ µÚ¼¯ÀÌ°Ô µÇ¾î¼­ µ¥ÀÌÅͰ¡ ¾û¸ÁÀ¸·Î µÉ °ÍÀÔ´Ï´Ù. ÀÌ °æ¿ì¸¦ º¸Åë µ¥ÀÌÅͰ¡ 'Å©·´' µÈ´Ù¶ó°í À̾߱⸦ ÇÕ´Ï´Ù. ½ÇÁ¦ÀÇ °æ¿ì¿¡´Â ÀÌ º¸´Ùµµ ´õ ´Ù¾çÇÑ ¹®Á¦°¡ ³ªÅ¸³³´Ï´Ù. ¿¬½À¿ëÀ¸·Î Â¥´Â ÇÁ·Î±×·¥ÀÏ °æ¿ì´Â ¸ð ¸£°ÚÁö¸¸ ½ÇÁ¦ »ç¿ëÀ» ¸ñÀûÀ¸·Î ÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ÀÌ·± °áÁ¡ÀÌ À־´Â ¾È µÉ °ÍÀÔ´Ï´Ù. (½ÇÁ¦ F1 ÀÇ ³»¿ëÀº »ç¶óÁö°ÚÁÒ? µ¤¾î½èÀ¸´Ï..) +---------------+ | F2 | +------------------+---------+-----+ | F0 | | | +------------------+---------+-----+ | F1 | +---------+ [±×¸²2 - ÇϳªÀÇ ÆÄÀÏ¿¡ µÎ°³ÀÇ ÇÁ·Î¼¼½º°¡ µ¿½Ã¿¡ ¾²±â¸¦ ÇßÀ» °æ¿ì] µÚ¿¡¼­ ¸»¾¸µå¸®°ÚÁö¸¸, ¿©±â¼­ ÆÄÀÏÀ» ¿­¾î¼­ ´Ý´Â ºÎºÐ±îÁö°¡ 'ÀӰ迵¿ª'À̶ó°í ÇÕ´Ï´Ù. ÀÌ ÀӰ迵¿ªÀº Çѹø¿¡ ÇϳªÀÇ ÇÁ·Î¼¼½º¸¸ÀÌ ¼öÇàµÇµµ·Ï ÇØ¾ß ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ÇÁ·Î¼¼½ºÀÇ µ¿±âÈ­ ¹®Á¦¸¦ ÇØ°áÇÏ´Â µ¥ IPC ¼³ºñ¸¦ »ç¿ëÇÏ¸é ¾ÆÁÖ À¯¿ëÇÕ ´Ï´Ù. ¤¤. ÇÁ·Î¼¼½º »çÀÌÀÇ µ¥ÀÌÅÍ ±³È¯¿¡ À־ ¾ÆÁÖ ¼Ò±Ô¸ð¿¡¼­ ´ë±Ô¸ð±îÁö È¿À²ÀûÀ¸·Î ó¸® ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÈçÈ÷ 'fifo' ¶ó°í ºÎ¸£´Â '¸í¸íµÈ ÆÄÀÌÇÁ'(ÆÄÀÌÇÁ°¡ °´°üÈ­ µÇ¾î À̸§ÀÌ ºÙ¿©Áø °Í)µµ ÇÁ·Î¼¼½º °£ÀÇ Åë½Å¿¡ »ç¿ëµÉ ¼ö ÀÖÁö¸¸ µ¥ÀÌÅÍ ±³È¯¿¡´Â ±× ¿ë·®¿¡ ÇÑ°è °¡ ÀÖ½À´Ï´Ù. ºñ±³Àû Àڱ׸¶ÇÑ µ¥ÀÌÅÍ ÀÏ °æ¿ì¿¡´Â ¼Õ½¬¿î '¸Þ½ÃÁö Å¥'¸¦ »ç¿ë ÇÒ ¼ö ÀÖ°í, ¼ö¸Þ°¡¿¡ À̸£´Â ¾ÆÁÖ Å« µ¥ÀÌÅÍ ÀÏ °æ¿ì¿¡´Â '°øÀ¯¸Þ¸ð¸®'¸¦ »ç¿ë ÇÏ¿© È¿À²ÀûÀ¸·Î ó¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¤§. IPC ÇÔ¼öµéÀº ÇϳªÇϳª°¡ ¾ÆÁÖ Àß ¼³°èµÇ¾î ÀÖÀ¸¸ç, °¢ ¼³ºñ¸¶´ÙÀÇ ÀϰüÀûÀÎ ÀÎ ÅÍÆäÀ̽º¸¦ »ç¿ëÇϰí ÀÖÀ¸¸ç »ç¿ë¹æ¹ý ¶ÇÇÑ ¼Õ½±½À´Ï´Ù. ½Ã½ºÅÛ V IPC ÀÇ ¶Ç´Ù¸¥ ÀåÁ¡Àº ÇØ´ç ÇÔ¼öµéÀÌ ÇϳªÇϳª°¡ °­·ÂÇÑ ±â´ÉÀ» °¡Áö°í ÀÖÀ¸¸ç IPC ¼³ºñº°·Î ¸¶·ÃµÈ ÇÔ¼öµéÀÌ ¾ÆÁÖ À¯»çÇÏ°Ô µ¿ÀÛÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. µû¶ó¼­ Çϳª¸¸ Á¦´ë·Î ¾Ë¸é ³ª¸ÓÁö °Íµµ ÀÍÈ÷´Â µ¥ ±×¸® ¾î·ÆÁö ¾Ê½À´Ï´Ù. ¤©. ÇÁ·Î±×·¥ »óÀÇ Äڵ带 °£·«È­ ÇÒ ¼ö ÀÖ½À´Ï´Ù. ´Ù¸¥ ¼³ºñ¸¦ »ç¿ëÇÏ´Â °Íº¸´Ù ½Å°æ ¾µ ºÎºÐÀÌ ÁÙ¾îµé¸ç, ÇÔ¼öÀÇ °¹¼öµµ Àû¾îÁú °Í À̸ç, ¼Ò½ºÀÇ ÄÚµå ¶ÇÇÑ °£°áÇÏ°Ô ¸¸µé ¼ö ÀÖ½À´Ï´Ù. À̰ÍÀº ³ªÁß¿¡ ½ÇÁ¦·Î ÄÚµå ¸¦ ÀÛ¼ºÇØ º¸½Ã¸é ¾Ë ¼ö ÀÖ½À´Ï´Ù. ³ª. IPC ÀÇ ¿ø¸® ÀÌÁ¦, IPC ÀÇ ±âº» ¿ø¸®¸¦ »ìÆìº¸µµ·Ï ÇϰڽÀ´Ï´Ù. ÆÄÀÌÇÁ³ª ¿©Å¸ÀÇ ÀÎÅÍÆäÀ̽º¿Í´Â Á¶±Ý »ö´Ù¸¥ ¹æ¹ýÀ» »ç¿ëÇÕ´Ï´Ù. Áï, ÇÁ·Î¼¼½º°£ Åë½ÅÀ» À§ÇØ IPC ¼³ºñ¸¦ ÇÊ¿ä·Î ÇÏ´Â ÇÁ·Î¼¼½º´Â ½Ã½ºÅÛ Àü¿ª¿¡ °ÉÃÄ »ç¿ëÇÒ ¼ö ÀÖ´Â ÇØ´ç ¼³ºñ¸¦ ¸¸µé ¼ö ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù. ±âÁ¸ÀÇ ¼³ºñµéÀÌ Áö¿ªÀûÀ¸·Î À¯È¿Çϰųª, ½Ã½ºÅÛ È£ÃâÀ» »ç¿ëÇÏ¿© Ä¿³Î¿¡ ¿äûÇÏ´Â °Í°ú °°Àº °£Á¢ÀûÀÎ ¹æ½ÄÀ» »ç¿ëÇØ¿Ô´Ù¸é, IPC ¼³ºñ´Â Á» ´õ »ç¿ëÀÚ°¡ Á÷ Á¢ÀûÀ¸·Î ¼Õ½±°Ô Á¢±ÙÇÒ ¼ö ÀÖ´Â ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù°í º¼ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ Á¡ ¶§¹®¿¡ óÀ½¿¡ IPC °¡ µîÀåÇßÀ» ¶§, IPC ¸¦ UNIX ¿¡ À־ ¾ÆÁÖ ÀÌ»öÀûÀÎ °ÍÀ¸ ·Î »ý°¢ÇÏ´Â »ç¶÷ÀÌ ¸¹¾Ò´ø °Í °°½À´Ï´Ù. Áö±ÝÀÌ¾ß IPC º¸´Ù Á» ´õ ¹ßÀüµÈ ÇüÅÂÀÇ 'ÇÁ·Î¼¼½º°£ Åë½Å ¼³ºñ'¸¦ ¿¬±¸°¡ ÁøÇàµÇ°í ÀÖÁö¸¸¿ä. +-------------+ +--------------+ | ÇÁ·Î¼¼½º P1 | | ÇÁ·Î¼¼½º P2 | +-------------+ +--------------+ | ^ \ ^ / ^ | ^ »ç¿ëÀÚ ÇÁ·Î¼¼½º | | \ \ / / | | ¿µ¿ª | | \ \ / / | | | | \ \ / / | | | | \ \ / / | | - - -| -| - -- \- -\ - - -- -/ - /- - -- - - |- |- -- - - - - -- - - - - | | \ \ / / | | V | \ \ V / V | ½Ã½ºÅÛ ¿µ¿ª +-----------+ V +-----------+ +-----------+ | 123 | | 342 | | 582 | +-----------+ +-----------+ +-----------+ | 139 | | 116 | | 632 | +-----------+ +-----------+ +-----------+ | 156 | | 400 | | 215 | +-----------+ +-----------+ +-----------+ ¼¼¸¶Æ÷¾î °øÀ¯¸Þ¸ð¸® ¸Þ½ÃÁö Å¥ ¼¼±×¸ÕÆ® [ ±×¸²3 - IPC ¼³ºñ¿Í ÇÁ·Î¼¼½º ] À§¿¡¼­ º¸½Ã´Â ¹Ù¿Í °°ÀÌ, ÇÁ·Î¼¼½º°£¿¡ Á÷Á¢ÀûÀ¸·Î Åë½ÅÀ» ÇÏ´Â °ÍÀÌ ¾Æ´Ï°í, ½Ã½º ÅÛ ³»ºÎ¿¡ ÀÖ´Â IPC ¼³ºñµéÀ» ÅëÇÏ¿© µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ´Â °ÍÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ¼³ºñµé Àº ¾î¶°ÇÑ ÇÁ·Î¼¼½º¶óµµ ¸¸µé ¼ö ÀÖÀ¸¸ç, ¾ø¾Ö´Â °ÍÀº ±ÇÇÑÀ» °¡Áø ÇÁ·Î¼¼½º¶ó¸é °¡ ´ÉÇÕ´Ï´Ù. ¸¶Ä¡ ÆÄÀÏÀÇ Á¢±Ù±ÇÇѰú À¯»çÇÏ°Ô ÇØ´ç IPC ¼³ºñµéµµ Á¢±Ù±ÇÇÑÀÌ ÀÖÀ¸¸ç ±ÇÇÑÀ» º¯°æÇÏ´Â °Íµµ °¡´ÉÇÕ´Ï´Ù. ±×¸®°í À§¿¡¼­ ¼ýÀÚ´Â °¢ ¼³ºñ¾ÈÀÇ ÇϳªÀÇ °´Ã¼ ÀÇ ½Äº°ÀÚ(¶Ç´Â ¾ÆÀ̵ð)ÀÔ´Ï´Ù. ¸¶Ä¡ ¿ì¸®°¡ º¸Åë »ì°í ÀÖ´Â ÁýÀ» ÁÖ¼Ò·Î ÂüÁ¶Çϵí ÀÌ ÇϳªÀÇ ¼³ºñ¸¦ °íÀ¯ÇÑ ¼ýÀÚ·Î ÂüÁ¶ÇÏ´Â °ÍÀÔ´Ï´Ù. ¹°·Ð À§ÀÇ ¼ýÀÚ´Â ÇϳªÀÇ ¿¹ ÀÏ »ÓÀÔ´Ï´Ù. ´Ù. IPC ÀÎÅÍÆäÀ̽º IPC ¿¡ ÀÌ·¸°Ô ¼­·Î´Ù¸¥ ¼¼¸¶Æ÷¾î, °øÀ¯¸Þ¸ð¸®, ¸Þ½ÃÁö Å¥°¡ ÀÖÁö¸¸, ¼­·Î Á¢±ÙÇÏ´Â ¹æ¹ýÀº ºñ½ÁÇÕ´Ï´Ù. ½ÇÁ¦ ÇÔ¼ö¸¦ ¼³¸íÇÒ ¶§ ÀÌÇØÇϱ⠽±µµ·Ï ¸ÕÀú °¢ ±â´Éº°·Î ¹­ ¾î¼­ ¸»¾¸ µå¸®°Ú½À´Ï´Ù. ¤¡. IPC ¼³ºñ »ý¼º°ú ½Äº°ÀÚ ¾ò±â semget, shmget, msgget ÇÔ¼ö°¡ ¼¼¸¶Æ÷¾î, °øÀ¯¸Þ¸ð¸®, ¸Þ½ÃÁö Å¥¿¡¼­ °¢°¢ ÇØ´ç ¼³ ºñ¸¦ »ý¼ºÇÏ°í ½Äº°ÀÚ¸¦ ¾ò´Â ÇÔ¼öÀÔ´Ï´Ù. À̵é ÇÔ¼ö¿¡¼­ ¸Å°³º¯¼ö¿¡ IPC_CREAT ¸¦ ¼³Á¤ÇÏ¸é °ü·Ã ¼³ºñ¸¦ »ý¼ºÇÒ ¼ö ÀÖÀ¸¸ç, Á¢±Ù±ÇÇѵµ µ¿½Ã¿¡ ÆÄÀÏÁ¢±Ù±ÇÇѰú ¸¶Âù°¡ Áö·Î '666' µî°ú °°ÀÌ ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. À̵é ÇÔ¼ö°¡ µ¹·ÁÁÖ´Â °ªÀº, ÀϹÝÀûÀ¸ ·Î ÇØ´ç IPC ¼³ºñÀÇ ½Äº°ÀÚÀÔ´Ï´Ù. ¸¶Ä¡ ÆÄÀÏÀ» ¿­¾úÀ» °æ¿ì¿¡ ¾òÀ» ¼ö ÀÖ´Â, ÆÄÀÏ ½ºÆ®¸²À̳ª ÆÄÀÏ µð½ºÅ©·´ÅÍ °°Àº °ÍÀÔ´Ï´Ù. ÆÄÀÏ µð½ºÅ©·´ÅÍ¿Í ´õ °¡±õ°Ú±º¿ä. ¤¤. IPC Á¦¾îÇϱâ semctl, shmctl, msgctl ÇÔ¼ö°¡ ¼¼¸¶Æ÷¾î, °øÀ¯¸Þ¸ð¸®, ¸Þ½ÃÁö Å¥¿¡¼­ °¢°¢ ÇØ´ç ¼³ ºñÀÇ ±ÇÇÑÀ» ¼³Á¤Çϰųª ÇÏ´Â µîÀÇ Á¦¾î¸¦ ¼öÇàÇÕ´Ï´Ù. ¤§. ÇØ´ç IPC ¼³ºñ¿¡ µû¸¥ ÀÎÅÍÆäÀ̽º ¼¼¸¶Æ÷¾î¿¡¼­´Â semop ¸¦ »ç¿ëÇÏ¿© ¼¼¸¶Æ÷¾î º¯¼öÀÇ °ªÀ» º¯°æ½Ã۸ç, °øÀ¯¸Þ¸ð¸®¿¡ ¼­´Â shmat À» »ç¿ëÇÏ¿© °øÀ¯¸Þ¸ð¸®¸¦ ÇØ´ç ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò¿µ¿ª¿¡ µ¡ºÙ¿© »ç¿ë°¡´É ÇÏ°Ô ¸¸µé¸ç, shmdt ¸¦ »ç¿ëÇÏ¿© °øÀ¯¸Þ¸ð¸®¸¦ ÇØ´ç ÇÁ·Î¼¼½ºÀÇ ÁÖ¼Ò¿µ¿ª¿¡¼­ ¶¼¾î ³»¾î »ç¿ëÇÏÁö ¸øÇϵµ·Ï Çϸç, ¸Þ½ÃÁö Å¥¿¡¼­´Â msgsnd ¿Í msgrcv ¸¦ »ç¿ëÇÏ¿© ¸Þ½Ã Áö¸¦ ÁÖ°í ¹Þ½À´Ï´Ù. ¤©. IPC Á¦°ÅÇϱâ IPC ¸¦ Á¦°ÅÇÏ´Â ¹æ¹ýÀº semctl, shmctl, msgctl À» »ç¿ëÇÏ¿© ÇØ´ç ¸Å°³º¯¼öÀÇ Ç÷¡ ±×¸¦ IPC_RMID ·Î ¼³Á¤ÇÔÀ¸·Î½á ¾ø¾Ù ¼ö ÀÖ½À´Ï´Ù. ¿©±â¿¡¼­ semget, shmget, msgget ÇÔ¼ö¿¡¼­ ¾òÀº ÇØ´ç ¼³ºñÀÇ ½Äº°ÀÚ¸¦ ´Ù¸¥ ÇÔ¼ö¿¡ ¼­ »ç¿ëÇÕ´Ï´Ù. (3Àå ¼¼¸¶Æ÷¾î°¡ °è¼Ó µË´Ï´Ù. ) ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 476¹ø Á¦ ¸ñ:[°­ÁÂ2] ½Ã½ºÅÛ V IPC - ¼¼¸¶Æ÷¾î ¿Ã¸°ÀÌ:ddoch (Çѵ¿ÈÆ ) 97/07/06 00:33 ÀÐÀ½:2199 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- 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³âµ¿¾È °í»ýÇϸ鼭 »ý°¢ÇÑ °á·ÐÀº '¿¹Á¦¼Ò½º¸¦ ¾î¶°ÇÑ ¹æ½ÄÀ¸·Î´ø Á¦°øÀ» ÇÏÁö ¾Ê ´Â Ã¥Àº »çÁö¸»ÀÚ' ÇÏ´Â °Å¿´½À´Ï´Ù. ±×¶§ ¿¹Á¦ ¼Ò½º¸¸ ¾î¶»°Ô ±¸ÇÒ ¼ö ÀÖ¾ú¾îµµ ÀÌ·± ºÀº¯Àº ´çÇÏÁö ¾Ê¾ÒÀ» °Ì´Ï´Ù. ¾Æ¿ï·¯ È¥ÀÚ¼­ °øºÎÇϽô ºÐµéÀº ÄÚµù»ó¿¡ ¾î¶² ¹®Á¦°¡ »ý°åÀ» ¶§ µµ¿òÀ» ¿äûÇÒ ¼ö ÀÖ´Â µµ¿ì¹Ì(?)¸¦ ÇѺР²¿¼ÅµÎ½Ê½Ã¿ä. °ñÄ¡¾ÆÇ ÇÁ·Î±×·¡¹Ö °ü·Ã Áú¹®Àº °Ô½ÃÆÇ¿¡ ¿Ã·Áµµ Àß ´äº¯ÀÌ ¾ø½À´Ï´Ù. -.- ) (°è¼Ó..) ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 477¹ø Á¦ ¸ñ:[°­ÁÂ3] ½Ã½ºÅÛ V IPC - ¼¼¸¶Æ÷¾î2 ¿Ã¸°ÀÌ:ddoch (Çѵ¿ÈÆ ) 97/07/06 00:34 ÀÐÀ½:1839 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- À§ÀÇ ¿¹Á¦¿¡¼­ ¼¼¸¶Æ÷¾î¸¦ ¸¸µé¾î ³õ±â¸¸ Çϰí Á¦°Å¸¦ ÇÏÁö ¾Ê¾Ò½À´Ï´Ù. ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ°í³­ ÀÌÈĺÎÅÍ ½Ã½ºÅÛÀÌ ³¡³¯ ¶§ ±îÁö ½ÇÇàµÇ´Â ÇÁ·Î±×·¥À̰ųª, ¶Ç´Â Áß°£ Áß°£¿¡ ¿©·¯¹ø ½ÇÇàµÇ´Â ÇÁ·Î±×·¥ÀÌ¸é ¸ð¸£°ÚÀ¸³ª, ±×·¸Áö ¾ÊÀº °æ¿ì¿¡´Â ¼¼¸¶Æ÷¾î ¸¦ Á¦°ÅÇØÁÖ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. Áï, ´õÀÌ»ó »ç¿ëÇÒ Çʿ䰡 ¾øÀ¸¸é ½Ã½ºÅÛ ÀÚ¿øÀ» Àý ¾àÇÑ´Ù´Â Â÷¿ø¿¡¼­ ¾ø¾ÖÁÖ´Â °ÍÀÌÁö¿ä. º¸Åë ÇÁ·Î±×·¥ ³»¿¡¼­ ¼¼¸¶Æ÷¾î°¡ ´õÀÌ»ó ÇÊ¿ä¾ø´Ù°í ÆÇ´ÜÀ» ³»¸± ¸¸ÇÑ ¾î¶² Á¶°ÇÀÌ ÂüÀΰ¡¸¦ °Ë»çÇØ¼­ ¾ø¾Ö´Â ¹æ¹ýÀÌ Á¦ÀÏ ÆíÇϰڽÀ´Ï´Ù¸¸ ±×·¸Áö ¾Ê°í, ÇÁ·Î±×·¥À» ½ÇÇà½Ãų ¶§ ȯ°æº¯¼ö¸¦ È®ÀÎÇϰųª ÀÎÀÚ ¸¦ Á־ ó¸®ÇÏ´Â ¹æ¹ýµµ ÀÖ½À´Ï´Ù. ¿©±â¼­´Â ¸ÕÀú 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) { 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; } 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 ¼³ºñ¿¡¼­ »©³õÀ» ¼ö ¾ø´Â °øÀ¯ ¸Þ¸ð¸®¿¡ ´ëÇØ¼­ ÀÚ¼¼È÷ ¾Ë¾Æº¸°Ú½À´Ï´Ù. (°è¼Ó) ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 478¹ø Á¦ ¸ñ:[°­ÁÂ4] ½Ã½ºÅÛ V IPC - °øÀ¯¸Þ¸ð¸® ¿Ã¸°ÀÌ:ddoch (Çѵ¿ÈÆ ) 97/07/06 00:35 ÀÐÀ½:1978 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- 4. °øÀ¯¸Þ¸ð¸® º¸Åë, ÇÁ·Î¼¼½º´Â ÀڽŸ¸ÀÇ µ¶ÀÚÀûÀÎ ¸Þ¸ð¸® ¼¼±×¸ÕÆ®¸¦ °¡Áö°Ô µË´Ï´Ù. fork ·Î »ý¼ºµÈ ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ °æ¿ì¿¡µµ ´ëºÎºÐÀÇ ºÎ¸ðÀÇ Á¤º¸¸¦ º¹»çÇÏ°Ô µÇ¸ç ÀڽŸ¸ÀÇ ¸Þ¸ð¸® ÁÖ¼Ò°ø°£À» È®º¸ÇÕ´Ï´Ù. ¹°·Ð ¾²·¹µå(°æ·® ÇÁ·Î¼¼½º)°°Àº °æ¿ì¿¡´Â °¢ ¾² ·¹µåº° ÁÖ¼Ò°ø°£À» °øÀ¯ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ¾Æ¿ï·¯ ÇÁ·Î¼¼½º¿¡¼­µµ °øÀ¯ ¶óÀ̺귯¸® ³ª ÇÁ·Î±×·¥ ÄÚµå´Â °øÀ¯µÉ ¼öµµ ÀÖ½À´Ï´Ù. ¹°·Ð ÀÌ·¯ÇÑ °æ¿ì¿¡µµ µ¥ÀÌÅÍ ¿µ¿ªÀº °¢ÀÚ º¸À¯ÇÏ°Ô µÇ¸ç, Äڵ念¿ªÀº Àб⸸ °¡´ÉÇÒ °ÍÀÔ´Ï´Ù. µû¶ó¼­ ÀϹÝÀûÀÎ ÇÁ·Î¼¼ ½ºÀÇ °³³ä¿¡¼­ '¿øÇϱ⸸ ÇÏ¸é ¸ðµç ÇÁ·Î¼¼½ºµéÀÌ ¸Þ¸ð¸®»óÀÇ ÀÏÁ¤ ÁÖ¼Ò°ø°£À» °øÀ¯ ÇÏ¿© Àб⠾²±â¸¦ ÇÒ ¼ö ÀÖ´Ù.'´Â '°øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®'ÀÇ °³³äÀº Çõ½ÅÀûÀÎ °ÍÀÓ¿¡ Ʋ¸²¾ø½À´Ï´Ù. °æ¿ì¿¡ µû¶ó ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ ¾ÆÁÖ À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. ÀϹÝÀûÀ¸·Î, ¿Â¶óÀÎ Åë½Å¸ÁÀÇ '´ëÈ­¹æ' ½Ã½ºÅÛ¿¡¼­ °øÀ¯¸Þ¸ð¸®¸¦ Ȱ¿ëÇÏ´Â °æ¿ì°¡ ¸¹ À¸¸ç, 'ÆùÆ®°øÀ¯' ½Ã½ºÅÛÀÇ ±¸¼ºµµ °¡´ÉÇÕ´Ï´Ù. Uterm À̶ó´Â 'À¯´ÏÄÚµå Å͹̳Î' (µ¿È£È¸ ÀÚ·á½Ç¿¡ ÀÖÀ½) ÇÁ·Î±×·¥Àº À¯´ÏÄڵ忡 ÇÊ¿äÇÑ ÆùÆ®¸¦ ½ÃÀÛÇÒ ¶§ °øÀ¯¸Þ¸ð¸® ¿¡ ·ÎµùÀ» ÇØ¼­ »ç¿ëÀ» ÇÏ´õ±º¿ä. ÀÌ·¸°Ô ÇÏ¸é °¢ÀÚÀÇ ÀÀ¿ë ÇÁ·Î±×·¥¸¶´Ù ÆùÆ®¸¦ ´Ù ½Ã ºÒ·¯µéÀ̰ųª ¸Þ¸ð¸®¿¡ ÃàÀûÇÒ Çʿ䰡 ¾ø´Ù´Â ÀåÁ¡ÀÌ ÀÖ½À´Ï´Ù. ¶Ç´Ù¸¥ ¾ÆÀÌÅÛ À» »ý°¢ÇØ º»´Ù¸é, '½Ã½ºÅÛ Àü¿ªÀÇ ¸Þ¸ðÀå' °°Àº ¾Æ±âÀÚ±âÇÑ °Íµµ ³ª¿Ã ¼ö ÀÖ°Ú±º ¿ä. ¹°·Ð ±× Çʿ伺Àº ÇÁ·Î¼¼½º°£ÀÇ µ¥¿ë·® µ¥ÀÌÅÍ ±³È¯½Ã¿¡³ª, ½Ã½ºÅÛ¿¡¼­ÀÇ ¼ö ¸¹Àº ÇÁ·Î¼¼½ºµéÀÌ ÀÏÁ¤ÇÑ ¸Þ¸ð¸®¸¦ °øÀ¯ÇÏ´Â °ÍÀÌ ÇÊ¿äÇϴٰųª, ÀÌ·¸°Ô ÇÏ´Â °ÍÀÌ È¿À²ÀûÀÏ °æ¿ì¿¡ »ç¿ëÇÒ ¼ö ÀÖ°ÚÁö¿ä. ±×·³, °øÀ¯¸Þ¸ð¸®¸¦ ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö ¾Ë¾Æº¼±î¿ä? º¸Åë, °øÀ¯¸Þ¸ð¸®¿¡ ´ëÇÑ Ã³¸®´Â ´ÙÀ½ÀÇ ¼ø¼­·Î ÇÏ°Ô µË´Ï´Ù. * °øÀ¯¸Þ¸ð¸®¸¦ È®º¸ÇÑ´Ù. * °øÀ¯¸Þ¸ð¸®ÀÇ ÁÖ¼Ò¸¦ ÇÁ·Î¼¼½ºÀÇ ÀÚ½ÅÀÇ Àڷ῵¿ªÀ¸·Î µ¡ºÙÀδÙ. (Á¢¼Ó) ±×¸®°í ÀÛ¾÷À» ÇÑ´Ù. * °øÀ¯¸Þ¸ð¸®ÀÇ ÁÖ¼Ò¸¦ ÇÁ·Î¼¼½º¿Í ºÐ¸®¸¦ ½ÃŲ´Ù. (Á¢¼Ó²÷±â) * °øÀ¯¸Þ¸ð¸®¸¦ Á¦°ÅÇÑ´Ù. ÀÌÁ¦ Â÷·Ê´ë·Î Çϳª¾¿ »ìÆìº¸ÁÒ. °¡. °øÀ¯¸Þ¸ð¸® È®º¸Çϱ⠰øÀ¯¸Þ¸ð¸®¸¦ È®º¸ÇÏ´Â ÇÔ¼ö´Â.. int shmget(key_t key, int size, int shmflg); key_t ÀÚ·áÇüÀº ¸®´ª½º¿¡¼­´Â int¿Í °°½À´Ï´Ù. key´Â °øÀ¯¸Þ¸ð¸®¸¦ È®º¸Çϱâ À§ÇÑ '۰ª' ÀÔ´Ï´Ù. »ç¿ëÀÚÀÇ ÀÓÀÇ´ë·Î ÁöÁ¤ÇØ ÁÙ ¼ö ÀÖ½À´Ï´Ù. key°¡ °°À¸¸é ¹ÝȯµÇ´Â °ªµµ °°½À´Ï´Ù. size´Â °øÀ¯¸Þ¸ð¸®¿¡ È®º¸ÇÒ byte ¼öÀÔ´Ï´Ù. shmflg´Â °øÀ¯¸Þ¸ð¸®¸¦ È®º¸ÇÏ´Â ¹æ¹ýÀ̰ÚÁö¿ä. ¿©±â¿¡ ÀϹÝÀûÀ¸·Î µé¾î°¡´Â °ªÀº, IPC_CREAT : °øÀ¯¸Þ¸ð¸®¸¦ ¸¸µç´Ù. IPC_EXCL : IPC_CREAT¿Í °°ÀÌ »ç¿ëµÈ´Ù. ÀÌ¹Ì ÁöÁ¤ÇÑ Å°°ªÀÇ °øÀ¯¸Þ¸ð¸®°¡ Á¸Àç ÇÒ °æ¿ì¿¡´Â ½ÇÆÐÇÑ´Ù. mode_flags: ÆÄÀÏÆÛ¹Ì¼Ç°ú °°Àº ÇüÅÂÀÇ °øÀ¯¸Þ¸ð¸® Á¢±Ù±ÇÇÑÀ» ÁöÁ¤ÇÑ´Ù. ÀÌ °ªµéÀ» 'or'¿¬»êÀ» ÇÏ¿© »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¾Æ·¡¿Í °°ÀÌ »ç¿ëÇÒ ¼ö Àְڳ׿ä. int shmid; shmid = shmget(0x10, 20, IPC_CREAT|IPC_EXCL|0600); ۰ª 0x10À¸·Î °øÀ¯¸Þ¸ð¸® ¿µ¿ªÀ» 20bytes¸¸Å­ ¸¸µå´Â °ÍÀÔ´Ï´Ù. Á¢±Ù±ÇÇÑÀº '0600'ÀÌ µÇÁö¿ä. ¿©±â¼­ÀÇ ¹Ýȯ°ªÀÎ shmid´Â ÀÌÈÄÀÇ °øÀ¯¸Þ¸ð¸® ó¸® ÇÔ¼öµé¿¡ ¾²ÀÌ´Â ÆÄÀÏ ±â¼úÀÚ ¿Í ºñ½ÁÇÑ ¾ÆÀ̵ðÀÔ´Ï´Ù. ³ª. °øÀ¯¸Þ¸ð¸®¿¡ Á¢¼ÓÇϱâ ÀÌÁ¦ ÇÁ·Î¼¼½º ÀÚ½ÅÀÇ ³í¸®Àû Àڷ῵¿ªÀ¸·Î °øÀ¯¸Þ¸ð¸®¸¦ Á¢¼ÓÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æ º¸Áö¿ä. chat *shmat(int shmid, chat *shmaddr, int shmflg); shmid´Â ¾Õ¿¡¼­ ¹ÝȯµÈ ½Ã½ºÅÛ¿¡¼­ °øÀ¯¸Þ¸ð¸®¸¦ ±¸º°ÇÏ´Â ¾ÆÀ̵ðÀÔ´Ï´Ù. shmaddrÀÇ °ªÀ» ÅëÇØ¼­ °øÀ¯¸Þ¸ð¸®°¡ Á¢¼ÓµÇ´Â ¿µ¿ªÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ °ªÀÌ NULL ((char *)0) ÀÌ¸é ½Ã½ºÅÛÀÌ ¾Ë¾Æ¼­ Á¢¼ÓÀ» ½ÃÄÑÁÖÁö¿ä. ¸¸ÀÏ, °øÀ¯¸Þ¸ð¸®°¡ Á¢¼ÓµÉ ÁÖ¼Ò¸¦ Á÷Á¢ ÁöÁ¤ÇÏ°Ô µÇ¸é ½Ã½ºÅÛ°ú Çϵå¿þ¾î¿¡ ÀÇÁ¸Àû ÀÌ µÇ¾î¼­ Æ÷ÆÃ½Ã¿¡ ¹®Á¦°¡ ¸¹ÀÌ ¹ß»ýÇÕ´Ï´Ù. Ưº°ÇÑ °æ¿ì°¡ ¾Æ´Ï¸é ÁÖ¼Ò°ªÀ» ÁöÁ¤ÇÏÁö ¾Ê´Â °ÍÀÌ ÁÁ½À´Ï´Ù. shmflgÀÇ °ª Áß ÁÖ·Î ¾²ÀÌ´Â °ÍÀº ´ÙÀ½°ú °°½À´Ï´Ù. SHM_RDONLY : Á¢¼ÓµÇ´Â ¿µ¿ª¿¡ Àб⸸ Çã¿ëµÈ´Ù. SHM_RND : shmaddrÀÇ °ªÀÌ (char *)0ÀÌ ¾Æ´Ñ °æ¿ì¿¡ shmaddrÁÖ¼Ò ÁÖÀ§·Î Á¢¼ÓÀ» ÇÑ´Ù. ÀÌ ÇÔ¼öÀÇ ¹Ýȯ°ªÀº °øÀ¯¸Þ¸ð¸®¿¡ ´ëÇÑ ÁÖ¼ÒÀÔ´Ï´Ù. ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ°Ú½À´Ï´Ù. char *memptr; memptr= shmat(shmid, (char *)0, 0); shmid·Î °øÀ¯¸Þ¸ð¸®°¡ Á¢¼ÓµÇ´Â ±¸¿ªÀ» ½Ã½ºÅÛ¿¡ ¸Ã°Ü¹ö¸®´Â °ÍÀÔ´Ï´Ù. (Âü°í·Î µÚ¿¡ ¼³¸íÀÌ µÇ´Â °ÍÀÌÁö¸¸ shmatÀ» È£ÃâÇÏ¿© ¼º°øÇÏ¸é ±¸Á¶Ã¼ shmid_ds ÀÇ ¸î°¡Áö°¡ º¯°æµË´Ï´Ù. shm_atime : ÇöÀç ½Ã°£À¸·Î ³õ¿©Áý´Ï´Ù. shm_lpid : È£ÃâÇÑ ÇÁ·Î¼¼½ºÀÇ pid·Î ³õ¿©Áý´Ï´Ù. shm_nattch: Á¢±Ù ÇÁ·Î¼¼½ºÀÇ °¹¼ö°¡ Çϳª Áõ°¡ÇÕ´Ï´Ù. ) ´Ù. °øÀ¯¸Þ¸ð¸®¿Í Á¢¼Ó ²÷±â ÀÌÁ¦ °øÀ¯¸Þ¸ð¸®¿¡¼­ ÀÛ¾÷À» ÇÏ°í ³ª¼­ Á¢¼ÓÀ» ²÷´Â ¹æ¹ýÀ» ¾Ë¾Æº¾½Ã´Ù. int shmdt(char *shmaddr); shmaddrÀº °øÀ¯¸Þ¸ð¸®°¡ Á¢¼ÓÇÑ ÁÖ¼Ò·Î, ¾Õ¼­ÀÇ shmat¿¡¼­ ¹ÝȯµÈ memptr °ªÀÔ´Ï´Ù. ÀÌÁ¦ ÇÁ·Î¼¼½ºÀÇ ³í¸®Àû Àڷ῵¿ªÀÌ °øÀ¯¸Þ¸ð¸®¿Í ºÐ¸®°¡ µÇ¾ú½À´Ï´Ù. À̶§¿¡ ´Ù½Ã °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇϱ⸦ ½ÃµµÇϸé segmentation fault °¡ ¹ß»ýÇÕ´Ï´Ù. (¸¶Âù°¡Áö·Î ±¸Á¶Ã¼ shmid_dsÀÇ ¸â¹ö ¸î°¡Áö°¡ º¯°æÀÌ µË´Ï´Ù. shm_dtime : ÇöÀç ½Ã°£À¸·Î ³õ¿©Áý´Ï´Ù. shm_lpid : È£ÃâÇÑ ÇÁ·Î¼¼½ºÀÇ pid·Î ³õ¿©Áý´Ï´Ù. shm_nattch: Çϳª°¡ °¨¼ÒÇÕ´Ï´Ù. ) ¶ó. °øÀ¯¸Þ¸ð¸® Á¦°ÅÇÏ±â ¹× shmctlÇÔ¼ö ÀÍÈ÷±â shmctlÇÔ¼ö¸¦ ÅëÇØ¼­ ¿©·¯°¡Áö¸¦ ÇÒ ¼ö ÀÖ½À´Ï´Ù. * °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®¿¡ ´ëÇÑ Á¤º¸¾ò±â * °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®ÀÇ ¼ÒÀ¯ÀÚ, ±×·ì, Á¢±Ù±ÇÇÑ ¼³Á¤Çϱâ * °øÀ¯¸Þ¸ð¸® Á¦°ÅÇϱâ shmctlÇÔ¼öÀÇ ¿øÇüÀº ´ÙÀ½°ú °°½À´Ï´Ù. int shmctl(int shmid, int cmd, struct shmid_ds *buf); À§ÀÇ ¿©·¯°¡Áö ±â´ÉµéÀº shmid¿¡ ´ëÇØ Àû¿ëµÇ¸ç struct shmid_ds¸¦ ÅëÇØ ÀÌ·ç¾î Áý´Ï´Ù. struct shmid_ds´Â ÇϳªÀÇ °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®¿¡ ´ëÇÑ Á¤º¸¸¦ ´ãÀº 'linux/ shm.h'¿¡ Á¤ÀÇµÈ ±¸Á¶Ã¼ÀÔ´Ï´Ù. struct shmid_ds { struct ipc_perm shm_perm; /* ÆÛ¹Ì¼Ç */ int shm_segsz; /* ¼¼±×¸ÕÆ®ÀÇ Å©±â (bytes) */ time_t shm_atime; /* ¸¶Áö¸· Á¢±ÙÇÑ ½Ã°£ */ time_t shm_dtime; /* ¸¶Áö¸· Á¦°ÅµÈ ½Ã°£ */ time_t shm_ctime; /* ¸¶Áö¸· º¯°æµÈ ½Ã°£ */ unsigned short shm_cpid; /* ¸¸µç ÇÁ·Î¼¼½º ¾ÆÀ̵ð */ unsigned short shm_lpid; /* ¸¶Áö¸· ÀÛµ¿ÇÑ ÇÁ·Î¼¼½º ¾ÆÀ̵ð */ short shm_nattch; /* ÇöÀç Á¢±ÙÇÑ ÇÁ·Î¼¼½º ¼ö */ unsigned short shm_npages;/* ¼¼±×¸ÕÆ®ÀÇ Å©±â (ÆäÀÌÁö) */ unsigned long *shm_pages; struct shm_desc *attaches;/* Á¢±ÙÀ» À§ÇÑ ±â¼úÀÚ */ }; ipc_permÀÇ ±¸Á¶´Â ´ÙÀ½°ú °°½À´Ï´Ù. struct ipc_perm { key_t key; /* ۰ª */ ushort uid; /* ¼ÒÀ¯ÀÚÀÇ À¯È¿»ç¿ëÀÚ ¾ÆÀ̵ð */ ushort gid; /* ¼ÒÀ¯ÀÚÀÇ À¯È¿±×·ì ¾ÆÀ̵ð */ ushort cuid; /* ¸¸µçÀÌÀÇ À¯È¿»ç¿ëÀÚ ¾ÆÀ̵ð */ ushort cgid; /* ¸¸µçÀÌÀÇ À¯È¿±×·ì ¾ÆÀ̵ð */ ushort mode; /* Á¢±Ù ±ÇÇÑ */ ushort seq; /* sequence number */ }; shmctl ÇÔ¼öÀÇ µÎ¹øÂ° ÀÎÀÚÀÎ 'cmd'´Â ´ÙÀ½ÀÇ °ªµéÀÌ °¡´ÉÇÕ´Ï´Ù. IPC_STAT : °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®¿¡ ´ëÇÑ Á¤º¸¸¦ Àо buf(3¹øÂ° ÀÎÀÚ)¿¡ ÀúÀåÇÕ´Ï´Ù. IPC_SET : ÇöÀçÀÇ »ç¿ëÀÚ°¡ °¡Áø uid, gid, ±×¸®°í shm_permsÀÇ ÇʵåÀÇ mode¸¦ º¯°æÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. À̰ªµéÀº ´ç¿¬È÷ shmid_ds¸¦ ÅëÇØ¼­ ÁÖ¾îÁ®¾ß ÇϰÚÁö¿ä. mode¸¦ »ç¿ëÇÒ ¶§´Â ÇÏÀ§ 9ºñÆ®¸¸ÀÌ »ç¿ëµË´Ï´Ù. ÀÌ ±â´ÉÀ» È£ÃâÇϸé shm_ctimeÀÇ ³»¿ëÀÌ º¯°æµË´Ï´Ù. ±×¸®°í À̰ÍÀ» È£ÃâÇÒ·Á¸é ¼ÒÀ¯ÀÚ, ¸¸µçÀÌ, ¶Ç´Â ½´ÆÛÀ¯Àú¿©¾ß ÇÕ ´Ï´Ù. IPC_RMID : ÇØ´çÇÏ´Â °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®¸¦ Á¦°ÅÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. ´ç¿¬È÷ ¼ÒÀ¯ÀÚ, ¸¸µçÀÌ, ½´ÆÛÀ¯Àú¸¸ÀÌ °¡´ÉÇÕ´Ï´Ù. shmid_ds ±¸Á¶Ã¼ÀÇ ¸â¹öÀÎ shm_nattch(Á¢±ÙÇϰí ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ ¼ö)¸¦ 0À¸·Î ¸¸µì´Ï´Ù. ÀÌ ¿Ü¿¡µµ ¸î°¡Áö°¡ ´õ ÀÖ´Â µ¥, ÀÚÁÖ ¾²ÀÌ´Â °ÍÀÌ ¾Æ´Ñ ±î´ß¿¡ »ý·«ÇϰڽÀ´Ï´Ù. ¿©±â±îÁö´Â ¸î°¡Áö °øÀ¯¸Þ¸ð¸®¸¦ ´Ù·ç´Â ÇÔ¼öµé°ú ÀÌ¿¡ °ü·ÃµÈ ±¸Á¶Ã¼¸¦ ¾Ë¾Æº¸¾Ò ½À´Ï´Ù. ÀÌÁ¦ À̰ÍÀ» ÀÌ¿ëÇØ¼­ °£´ÜÇÑ ¼Ò½º¸¦ ÅëÇØ ¼Õ¿¡ ÀÍÈ÷´Â ½Ã°£À» ¸¶·ÃÇÏ°Ú ½À´Ï´Ù. ¸¶. ¿¹Á¦¸¦ ÅëÇØ¼­ ÀÍÈ÷±â ¸ÕÀú, ¸î°³ÀÇ °øÀ¯¸Þ¸ð¸® ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© °£´ÜÇÏ°Ô °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®¸¦ »ý¼ºÇØ ¼­ ¾ø¾Ö´Â °ÍÀ» Â¥º¼±î¿ä? ----------------------------------------------------------------------------- /* shmtest.c : °øÀ¯¸Þ¸ð¸® ¿¹Á¦ ù¹øÂ° - ¼¼±×¸ÕÆ®¸¦ »ý¼ºÇÏ°í ¾ø¾Ö±â */ #include #include #include #include #include #define KEY 0x10 /* Á¢±Ù ۰ª*/ #define PERM 0660 /* ÆÛ¹Ì¼Ç */ #define SIZE 20 /* °øÀ¯¸Þ¸ð¸®ÀÇ Å©±â¹ÙÀÌÆ® */ void main() { int shmid; /* °øÀ¯¸Þ¸ð¸® id */ char *memptr; /* °øÀ¯¸Þ¸ð¸®ÀÇ ÁÖ¼Ò */ /* °øÀ¯¸Þ¸ð¸® ¸¸µé±â */ if((shmid= shmget(KEY, SIZE, PERM|IPC_CREAT|IPC_EXCL)) < 0) { perror("shmget"); exit(1); } /* °øÀ¯¸Þ¸ð¸®¿¡ÀÇ ÇöÀç ½ÇÇàÇÁ·Î¼¼½ºÀÇ Á¢¼Ó, memptr¿¡´Â ±× ÁÖ¼Ò ¹Ýȯ */ if((memptr= shmat(shmid, (char *)0, 0)) == (char *)(-1)) { perror("shmat"); exit(1); } /* °øÀ¯¸Þ¸ð¸®ÀÇ ÁÖ¼Ò¿¡ ¹®ÀÚ¿­ Å×½ºÆ® */ strcpy(memptr, "Linux is Best!"); printf("shmkey = %d, shmid = %d\n", KEY, shmid); printf("memptr = %p : %s\n", memptr, memptr); sleep(1); printf("\nAfter shmget...\n"); system("ipcs -m"); /* °øÀ¯¸Þ¸ð¸® »óꏱâ */ if(shmdt(memptr) < 0) { /* ÇÁ·Î¼¼½º¿ÍÀÇ Á¢¼Ó ²÷±â */ perror("shmdt"); exit(1); } /* °øÀ¯¸Þ¸ð¸® Á¦°Å */ if(shmctl(shmid, IPC_RMID, (struct shmid_ds *)0) < 0) { perror("shmctl"); exit(1); } printf("\nAfter remove...\n"); system("ipcs -m"); } ----------------------------------------------------------------------------- ÄÄÆÄÀÏÀ» ÇØ¼­ ½ÇÇàÀ» ½ÃÄѺ¼±î¿ä? $ gcc -o shmtest shmtest.c $ shmtest shmkey = 16, shmid = 640 memptr = 0x40000000 : Linux is Best! After shmget... ------ Shared Memory Segments -------- shmid owner perms bytes nattch status 640 root 660 20 1 After remove... ------ Shared Memory Segments -------- shmid owner perms bytes nattch status ÇÁ·Î±×·¥ ÀÚü³»¿¡¼­ °øÀ¯¸Þ¸ð¸®ÀÇ »óŸ¦ ¾Ë±â À§Çؼ­ systemÇÔ¼ö¸¦ »ç¿ëÇÏ ¿´½À´Ï´Ù. °£´ÜÇØ¼­ ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °Í °°½À´Ï´Ù. ±×·³, ÀÌÁ¦ shmctlÇÔ¼ö¸¦ »ç¿ëÇØ¼­ °øÀ¯¸Þ¸ð¸®¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Á®¿Íº¾½Ã´Ù. --------------------------------------------------------------------------- /* shminfo.c : °øÀ¯¸Þ¸ð¸® µÎ¹øÂ° ¿¹Á¦ - ¼¼±×¸ÕÆ®¿¡ ´ëÇÑ Á¤º¸¾ò±â */ #include #include #include #include #include #define SNULL ((struct shmid_ds *)0) #define ERR ((char *)-1) void main() { int shmid; char *memptr; struct shmid_ds SHM; if((shmid= shmget(0x10, 20, 0600|IPC_CREAT|IPC_EXCL)) < 0) { perror("shmget"); exit(1); } if((memptr= shmat(shmid, NULL, 0)) == ERR) { perror("shmat"); exit(1); } if(shmctl(shmid, IPC_STAT, &SHM) < 0) { /* SHM¿¡ Á¤º¸¾ò±â */ perror("shmctl"); exit(1); } printf("===============================\n"); printf(" Shared Memory Information \n"); printf("===============================\n\n"); printf("Key Value : %d\n", SHM.shm_perm.key); printf("Owner Euid : %d\n", SHM.shm_perm.uid); printf("Owner Egid : %d\n", SHM.shm_perm.gid); printf("Creator Euid : %d\n", SHM.shm_perm.cuid); printf("Creator Egid : %d\n", SHM.shm_perm.cgid); printf("Access Mode : %o\n", SHM.shm_perm.mode); printf("Size of Segment (bytes) : %d\n", SHM.shm_segsz); printf("Last Attach Time : %s\n", ctime(&SHM.shm_atime)); printf("Last Detach Time : %s\n", ctime(&SHM.shm_dtime)); printf("Last Change Time : %s\n", ctime(&SHM.shm_ctime)); printf("Pid of Creator : %d\n", SHM.shm_cpid); printf("Pid of Last Operator : %d\n", SHM.shm_lpid); printf("No. of Current Attaches : %d\n", SHM.shm_nattch); printf("Size of Segment (pages) : %d\n", SHM.shm_npages); if(shmdt(memptr) < 0) { /* °øÀ¯¸Þ¸ð¸®¿ÍÀÇ ´ÜÀý */ perror("shmdt"); exit(1); } if(shmctl(shmid, IPC_RMID, SNULL) < 0) { /* °øÀ¯¸Þ¸ð¸® Á¦°Å */ perror("shmctl"); exit(1); } exit(0); } --------------------------------------------------------------------------- ÄÄÆÄÀÏ ÇØ¼­ ½ÇÇàÀ» ½ÃÄѺ¼±î¿ä? $ gcc -o shminfo shminfo.c $ shminfo =============================== Shared Memory Information =============================== Key Value : 16 Owner Euid : 501 Owner Egid : 100 Creator Euid : 501 Creator Egid : 100 Access Mode : 600 Size of Segment (bytes) : 20 Last Attach Time : Sat Jul 20 20:40:35 1996 Last Detach Time : Thu Jan 1 00:00:00 1970 Last Change Time : Sat Jul 20 20:40:35 1996 Pid of Creator : 572 Pid of Last Operator : 572 No. of Current Attaches : 1 Size of Segment (pages) : 0 µû·Î ¼³¸íÀº ÇÊ¿ä¾øÀ» °Í °°½À´Ï´Ù. À̹ø¿¡´Â shmctlÇÔ¼ö¿¡¼­ IPC_SETÀ» »ç¿ëÇØ ¼­ Á¢±Ù ±ÇÇÑÀ» º¯°æÇØ º¾½Ã´Ù. --------------------------------------------------------------------------- /* shmcmode.c : °øÀ¯¸Þ¸ð¸® ¼¼¹øÂ° ¿¹Á¦ - Á¢±Ù ±ÇÇÑ ¹Ù²Ù±â */ #include #include #include #include #define SNULL ((struct shmid_ds *)0) #define ERR ((char *)-1) void main() { int shmid; char *memptr; struct shmid_ds SHM; if((shmid= shmget(0x10, 20, 0600|IPC_CREAT|IPC_EXCL)) < 0) { perror("shmget"); exit(1); } if((memptr= shmat(shmid, NULL, 0)) == ERR) { perror("shmat"); exit(1); } if(shmctl(shmid, IPC_STAT, &SHM) < 0) { perror("shmctl"); exit(1); } printf("Before IPC_SET\n"); printf("Access Mode : %o\n", SHM.shm_perm.mode); SHM.shm_perm.mode = 0666; /* Á¢±Ù±ÇÇÑ ¹Ù²Ù±â */ if(shmctl(shmid, IPC_SET, &SHM) < 0) { perror("shmctl"); exit(1); } if(shmctl(shmid, IPC_STAT, &SHM) < 0) { /* Á¤º¸ ´Ù½Ã ¾ò±â */ perror("shmctl"); exit(1); } printf("After IPC_SET\n"); printf("Access Mode : %o\n", SHM.shm_perm.mode); /* ¹Ù²ï Á¢±Ù ±ÇÇÑ Ãâ·Â*/ if(shmdt(memptr) < 0) { perror("shmdt"); exit(1); } if(shmctl(shmid, IPC_RMID, SNULL) < 0) { perror("shmctl"); exit(1); } exit(0); } --------------------------------------------------------------------------- ½ÇÇàÀ» ½ÃÄѺ¼±î¿ä? $ gcc -o shmcmode shmcmode.c $ shmcmode Before IPC_SET Access Mode : 600 After IPC_SET Access Mode : 666 À̹ø¿¡´Â ¸¸µé¾îÁø °øÀ¯¸Þ¸ð¸®¿¡ ÇÁ·Î¼¼½º°¡ Á¢¼ÓÀ» ÇÏÁö ¾Ê°í Á¢±ÙÇÑ´Ù¸é ¾î¶² °á°ú°¡ ³ªÅ¸³ª´Â Áö ½ÇÇèÀ» ÇØº¸µµ·Ï ÇÏÁö¿ä. ¾Æ¸¶ ¿¹»óµéÀº ÇÏ°í °è½Ã°ÚÁö¸¸. --------------------------------------------------------------------------- /* shmacces.c : °øÀ¯¸Þ¸ð¸® ³×¹øÂ° ¿¹Á¦ - °øÀ¯¸Þ¸ð¸®¿ÍÀÇ Á¢¼Ó ²÷¾îÁü ÈÄÀÇ Á¢±Ù */ #include #include #include #include #include #define SNULL ((struct shmid_ds *)0) #define ERR ((char *)-1) void main() { int shmid; char *memptr; if((shmid= shmget(0x10, 20, 0600|IPC_CREAT|IPC_EXCL)) < 0) { if((shmid= shmget(0x10, 20, 0)) < 0) { perror("shmget"); exit(1); } } if((memptr= shmat(shmid, NULL, 0)) == ERR) { perror("shmat"); exit(1); } strcpy(memptr, "Linux is Best!"); printf("%p : %s\n", memptr, memptr); if(shmdt(memptr) < 0) { perror("shmdt"); exit(1); } printf("%p : %s\n", memptr, memptr); if(shmctl(shmid, IPC_RMID, SNULL) < 0) { perror("shmctl"); exit(1); } exit(0); } --------------------------------------------------------------------------- $ gcc -o shmaccess shmaccess.c $ shmaccess 0x40000000 : Linux is Best! Segmentation fault ¿¹»óÇß´ø °á°ú°¡ ³ª¿ÔÁö¿ä. °øÀ¯¸Þ¸ð¸®¿¡ Á¢¼ÓÀ» ÇÏ¿´À» ¶§´Â Á¤»óÀûÀÎ ÀÛµ¿À» Çϳª Á¢¼ÓÀ» ²÷°í ³ª¼­´Â ÇԺηΠÀÚ½ÅÀÇ ¿µ¿ªÀÌ ¾Æ´Ñ ¸Þ¸ð¸®¸¦ ÂüÁ¶ÇÒ ¼ö ¾øÀ½ À¸·Î ±× À¯¸íÇÑ 'Segmentation fault' ¿¡·¯°¡ ³ª¿Ô½À´Ï´Ù. ùºÎºÐ¿¡¼­ ۰ª¿¡ ÀÇÇÑ °øÀ¯¸Þ¸ð¸® ¸¸µé±â¸¦ ½ÃµµÇϰí ÀÌ¹Ì ¸¸µé¾îÁ® ÀÖÀ¸¸é shmid°ª¸¸ ¾ò¾î³»´Â ·çƾÀÌ ÇÑ ÁÙ ´õ µé¾î°¡ ÀÖ´Ù´Â °Í »©°í´Â Ưº°È÷ ´Þ¶óÁø °ÍÀÌ ¾ø½À´Ï´Ù. ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 480¹ø Á¦ ¸ñ:[°­ÁÂ5] ½Ã½ºÅÛ V IPC - ¸Þ½ÃÁö Å¥ ¿Ã¸°ÀÌ:ddoch (Çѵ¿ÈÆ ) 97/07/11 23:49 ÀÐÀ½:1805 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- ¹Ù. °øÀ¯¸Þ¸ð¸®ÀÇ È°¿ë¿µ¿ª À§¿¡¼­µµ Àá±ñ ¸»¾¸µå·ÈÁö¸¸, »ý°¢Çϱ⿡ µû¶ó¼­ ¿©·¯±ºµ¥ ÀÀ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿©±â¼­´Â °£´ÜÇÏ°Ô ¿Â¶óÀÎ ½Ã½ºÅÛÀÇ '´ëÈ­¹æ'ÀÇ °æ¿ì¸¦ °í·ÁÇØ º¸Áö¿ä. ´ëÈ­¹æ ½Ã½ºÅÛÀº º¸Åë ´Ù¾çÇÑ ¿©·¯Á¾·ùÀÇ ¼³ºñ¸¦ »ç¿ëÇÏ¿© ±¸ÃàÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ç¿¬È÷ ½Ã½ºÅÛÀÇ ¿©·¯ ÇÁ·Î¼¼½ºµéÀÌ Åë½ÅÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» »ç¿ëÇÏ´Â µ¥, ¸¹ÀÌ »ç¿ë ÇÏ´Â ¹æ¹ýÀº 1) °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®, 2) »ç¿ëÀÚµð¹ÙÀ̽º¿¡ Á÷Á¢¾²±â, 3) ¸Þ½ÃÁö Å¥, 4) ¼ÒÄÏ µîÀÌ ÀÖÀ» °ÍÀÔ´Ï´Ù. ¹°·Ð À̵éÁß ÇϳªÀÌ»óÀ» °áÇÕÇÏ¿© »ç¿ëÇÏ´Â °æ¿ìµµ ¸¹À¸¸ç, ÄÚµåÀÇ ÀӰ迵¿ªÀ» º¸È£Çϱâ À§Çؼ­ ¾Õ¿¡¼­ ¾ð±ÞÇÑ ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇϱ⵵ ÇÕ´Ï´Ù. ÀÌ Áß ÇѰ¡Áö¸¸À» »ç¿ëÇÏ´Â °æ¿ìº¸´Ù 2-3 °¡Áö¸¦ ÇÔ²² »ç¿ëÇÏ¿©, °¢ ¼³ºñ ÀÇ ÀåÁ¡À» °í·ç »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. ´ëÈ­¹æ ½Ã½ºÅÛ¿¡´Â ´ëÈ­¹æ Á¦¸ñ, Âü¿©Àοø, Âü¿© ÇÁ·Î¼¼½º PID µîÀÇ ¸¹Àº Á¤º¸°¡ ÇÊ ¿äÇϸç, Á¦ÀÏ Áß¿äÇϰí ÇÙ½ÉÀûÀÎ ºÎºÐÀº ÇѸíÀÇ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÏ´Â ±ÛÀ» ´Ù¸¥ ÇÁ·Î¼¼½º¿¡°Ô Àü´ÞÇÏ¿© ÇØ´ç »ç¿ëÀÚÀÇ È­¸éÀ¸·Î »Ñ¸®´Â °ÍÀÔ´Ï´Ù. ´ëÈ­¹æ¿¡¼­ ÇØ´ç ÇÁ·Î¼¼½ºµéÀÌ ´Ù °°ÀÌ ÂüÁ¶ÇؾßÇÒ ±âº»ÀûÀÎ Á¤º¸ÀÎ ´ëÈ­¹æÁ¦¸ñ, Âü¿©ÀÚ µîÀº °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ¿©·¯¸ð·Î È¿À²ÀûÀ̰ÚÁö¸¸, °£Æí¼ºÀ» À§ÇØ Æ¯Á¤ÇÑ ÆÄÀÏ¿¡ µ¥ÀÌÅ͸¦ ÀúÀåÇØ¼­ »ç¿ëÇϱ⵵ ÇÕ´Ï´Ù. ÀÌ °æ¿ì¿¡´Â, °¢°¢ÀÇ Âü¿© ÇÁ·Î¼¼½º°¡ ÇØ´ç Á¤º¸¸¦ º¯°æÇÏ¿©¾ß ÇÒ Çʿ䰡 ÀÖ´Â µ¥, À̶§ ÀÌ Çʿ伺À» À§ÇØ °øÀ¯¸Þ¸ð¸®¿¡ Á¢±ÙÇÒ ¼ö ÀÖ½À´Ï´Ù. µ¿½Ã¿¡ ¿©·¯ ÇÁ·Î¼¼½º°¡ ÇØ´ç ¸Þ¸ð¸®¿¡ ¾²°Å³ª ÀÐÀ» ¼ö°¡ Àֱ⠶§¹®¿¡ ÀӰ迵¿ªÀÇ º¸È£¶ó´Â ¹®Á¦°¡ µîÀåÇϸç, ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÏ¿© ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù. ´õ Å« ¹®Á¦´Â »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ´Ù¸¥ »ç¿ëÀÚ¿¡°Ô Àü´ÞÇÏ´Â ºÎ ºÐÀÔ´Ï´Ù. ¸Þ½ÃÁö Àü´Þ¿¡ °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇϸé, ÇØ°áÇϱâ Èûµç ±âº»ÀûÀÎ ¹®Á¦Á¡ÀÌ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌÁ¦ ´ëÈ­¹æ¿¡¼­ äÆÃÀ» ÇÏ´Â ¸ð½ÀÀ» ¸Ó¸®¼Ó¿¡ ±×¸®¸é¼­ »ý°¢ ÇØ º¼±î¿ä? ¸Þ½ÃÁö Àü´Þ¿¡ °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÒ °æ¿ì, ´ÙÀ½°ú °°Àº È帧À» »ý°¢ÇÒ ¼ö ÀÖ½À´Ï´Ù. * ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ÇØ´ç »ç¿ëÀÚ¿¡°Ô¼­ ¹®ÀÚ¿­À» ÀԷ¹޴´Ù. * ¸Þ½ÃÁö¸¦ ¹ÞÀ» ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ °¹¼ö(¼ö½ÅÀÚ Ä«¿îÅÍ)¸¦ ¾ò¾î¼­, ±× ¼ýÀÚ¿Í ÇÔ²² ¸Þ½ÃÁö¸¦ °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®¿¡ Àü¼ÛÇÑ´Ù. * ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀº °øÀ¯¸Þ¸ð¸®¿¡ ¼ö½ÅÀÚ Ä«¿îÅ͸¦ Àо 0ÀÌ ¾Æ´Ò°æ¿ì °øÀ¯¸Þ¸ð ¸® ¼¼±×¸ÕÆ®¿¡¼­ ¹®ÀÚ¿­À» ÀоîµéÀ̰í, ¼ö½ÅÀÚ Ä«¿îÅ͸¦ 1 °¨¼Ò½ÃŲ´Ù. * ¸¶Áö¸·À¸·Î ¹®ÀÚ¿­À» Àд ÇÁ·Î¼¼½º´Â ¹®ÀÚ¿­À» Àоî¿Í¼­ ¼ö½ÅÀÚ Ä«¿îÅ͸¦ 0À¸·Î ¼³Á¤ÇÑ´Ù. * ¼ö½ÅÀÚ Ä«¿îÅͰ¡ 0À̶ó¸é ´ÙÀ½ ¹®ÀÚ¿­ÀÌ µµÂøÇÒ ¶§±îÁö ´ë±âÇÑ´Ù. ¿©±â¿¡¼­µµ ¹°·Ð, °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®¸¦ µ¿½Ã¿¡ ÀÐ°í ¾µ¼öµµ Àֱ⠶§¹®¿¡, ÄÚµåÀÇ ÀӰ迵¿ªÀ» º¸È£ÇØ¾ß ÇÏ´Â ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù. °øÀ¯¸Þ¸ð¸® ¼³ºñ ÀÚü´Â ÀӰ迵¿ªÀ» º¸È£ÇÒ ¼ö ÀÖ´Â ¾î¶² ¹æ¹ýÀ» Á¦°øÇÏÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù. À§ÀÇ È帧¿¡¼­ ÇØ°áÇϱⰡ Á» Èûµç ºÎºÐÀÌ ÀÖ½À´Ï´Ù. ÇØ´ç ÇÁ·Î¼¼½º°¡ °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®¿¡ ¹® ÀÚ¿­ÀÌ µµÂøÇÏ´Â ½Ã°£À» ¾î¶»°Ô ¾Æ´À³Ä ÇÏ´Â °ÍÀÔ´Ï´Ù. ¼¼±×¸ÕÆ®¿¡¼­ ÇϳªÀÇ º¯¼ö ·Î Á¸ÀçÇÒ ¼ö½ÅÀÚ Ä«¿îÅͰ¡ 0À̶ó´Â °ÍÀ» °è¼Ó È®ÀÎÇϱâ À§ÇØ ½¬Áöµµ ¾Ê°í while ¹®À¸·Î °Ë»ç¸¦ ÇÒ °æ¿ì, ½Ã½ºÅÛ ÀüüÀÇ CPU ÀÚ¿øÀ» ¾öû³ª°Ô Àâ¾Æ¸Ô±â ¶§¹®¿¡ ÀÌ·¸ °Ô ÇØ¼­´Â ¾ÈµË´Ï´Ù. ¹®ÀÚ¿­ÀÌ µµÂøÇßÀ» ¶§ SIGNAL À» º¸³»´Â °Íµµ ¸¶¶¥ÇÑ ¹æ¹ýÀÌ ¾Æ´Õ´Ï´Ù. ±×·¸´Ù°í ¾î¶² ÀÎÅÍ·´Æ® Çڵ鷯¸¦ ¼³Ä¡Çϱ⿡µµ °ï¶õÇÑ ¹®Á¦À̸ç, ¸Þ½Ã Áö Å¥¸¦ »ç¿ëÇÒ °æ¿ì ÀÎÅÍÆäÀ̽º°¡ ¾µµ¥¾øÀÌ º¹ÀâÇØÁö´Â ¹®Á¦°¡ ÀÖ½À´Ï´Ù. ¿©±â¿¡¼­ »ý°¢Çغ¼ ¸¸ÇÑ ¹®Á¦´Â ´ëÈ­¹æ ½Ã½ºÅÛÀÇ ÀüüÁ¤º¸´Â °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÏ¿© À¯ÁöÇϰí, ¸Þ½ÃÁö Àü´Þ¿¡´Â ¸Þ½ÃÁö Å¥¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. ´ëÈ­¹æ¿¡¼­ Çѹø ÀÔ·ÂÇÏ´Â ¹®ÀÚ¿­Àº ±×¸® Å©Áö ¾Ê±â ¶§¹®¿¡ ¸Þ½ÃÁö Å¥¸¦ »ç¿ëÇÏ´Â °ÍÀÌ È¿À²ÀûÀÏ ¼ö ÀÖ´Ù´Â À̾߱âÀÔ´Ï´Ù. »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ¹Þ¾ÆµéÀÎ »ç¿ëÀÚ ÇÁ·Î¼¼½º´Â, ÇöÀç ´ëÈ­¿¡ Âü¿©Çϰí ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ PID ¸¦ ¾ò¾î¼­, À̵鿡°Ô °¢°¢ ÇϳªÀÇ ¸Þ½ÃÁö¸¦ ¸Þ½ÃÁö Å¥·Î Àü´ÞÇÏ´Â °ÍÀÔ´Ï´Ù. ¸Þ½ÃÁö¸¦ Àü´Þ¹Þ´Â ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀº ¸Þ½ÃÁö°¡ ¾øÀ» °æ ¿ì ½Ã½ºÅÛ¿¡ ÀÇÇØ ºí·°µÉ °ÍÀ̱⠶§¹®¿¡ ½Ã½ºÅÛÀÇ ÀÚ¿øÀ» ¸¹ÀÌ ¼Ò¸ðÇÏÁö´Â ¾ÊÀ» °Í ÀÔ´Ï´Ù. ¾Æ¿ï·¯ Àڽſ¡°Ô ¿Â ¸Þ½ÃÁö¸¸ ¹Þ¾Æ¼­ »ç¿ëÀÚÀÇ Å͹̳ο¡ Ãâ·ÂÇÏ¸é µÇ°ÚÁö ¿ä. ÀÌÈÄ¿¡ ¼³¸íÇϰÚÁö¸¸, ¸Þ½ÃÁö Å¥¿¡¼­ ÇϳªÀÇ ¸Þ½ÃÁö´Â ÇÁ·Î¼¼½º°¡ ÀÐ°í³ª¸é ¾ø ¾îÁø´Ù´Â Ư¡ÀÌ ÀÖ½À´Ï´Ù. ÀÌÈÄ¿¡ °£´ÜÇÑ ´ëÈ­¹æ ½Ã½ºÅÛÀ» Á÷Á¢ ¼³°èÇØº¼ Áöµµ ¸ð¸£°ÚÁö¸¸, ¸ÕÀú ÀÌ¿¡ »ç¿ëÇÒ ¸Þ½ÃÁö Å¥¸¦ ¾Ë°í ³Ñ¾î°¡µµ·Ï ÇÏÁö¿ä. 5. ¸Þ½ÃÁö Å¥ ÀÌÁ¦ IPC ¼³ºñÀÇ ¸¶Áö¸·ÀÎ ¸Þ½ÃÁö Å¥¿¡ ´ëÇØ¼­ ¾Ë¾Æº¾½Ã´Ù. °¡. ¹Ì¸®º¸±â ¸Þ½ÃÁö Å¥´Â fifo¿Í ºñ½ÁÇϱä Çϳª, ÆÄÀÌÇÁ¸¦ ¿­°í ´Ý´Â °Í °°Àº º¹ÀâÇÑ °Í Àº ¾ø½À´Ï´Ù. ¸Þ½ÃÁö Å¥¸¦ »ç¿ëÇÑ´Ù ÇÏ´õ¶óµµ, fifo¿¡¼­ ó·³ ÆÄÀÌÇÁ°¡ °¡µæ Â÷ ¼­ ºí·°µÇ´Â °Í°ú ¹®Á¦Á¡¿¡¼­ ¹þ¾î³¯ ¼ö´Â ¾ø½À´Ï´Ù. ¸Þ½ÃÁö Å¥¸¦ »ç¿ëÇϸé ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ´Ù¸¥ ÇÁ·Î¼¼½º¿¡°Ô µ¥ÀÌÅ͸¦ º¸³¾ ¼ö ÀÖÀ¸ ¸ç, ÇØ´ç µ¥ÀÌÅÍ¿¡´Â ¼ö½ÅÀÚ ÇÁ·Î¼¼½º°¡ ½Äº°ÇÏ¿© ¹ÞÀ» ¼ö ÀÖµµ·Ï ¾î¶² ƯÁ¤ÇÑ Çü ÀÇ Á¤º¸¸¦ ÇÔ²² º¸³»¾ß ÇÕ´Ï´Ù. ¸Þ½ÃÁö Å¥ÀÇ ÀåÁ¡Àº fifo¿¡¼­ ³ªÅ¸³¯ ¼ö ÀÖ´Â, µ¿±âÈ­ ¹®Á¦¿Í ºí·°Å· ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ÜÁ¡Àº ÇϳªÀÇ µ¥ÀÌÅÍ ºí·°ÀÇ ÃÖ´ëÅ©±âÀÇ Á¦ÇѰú, ½Ã½ºÅÛ »óÀÇ ¸ðµç Å¥¿¡ ÀÖ´Â ºí·°ÀÇ Àüü ÃÖ´ë Å©±â¿¡ Á¦ÇÑÀÌ ÀÖ´Ù´Â Á¡ÀÔ´Ï´Ù. ÀÌ·¯ÇÑ Á¦ÇѰªÀ¸·Î Linux ¿¡¼­´Â MSGMAX(4096)°ú MSGMNB(16384)ÀÇ µÎ °ªÀÌ Á¤ÀǵǾî ÀÖ½À´Ï´Ù. MSGMAX ´Â ¸Þ½ÃÁö ÇϳªÀÇ ÃÖ´ëÅ©±â(¹ÙÀÌÆ®)À̰í MSGMNB ´Â ÇϳªÀÇ Å¥ÀÇ ÃÖ´ëÅ©±âÀÔ´Ï´Ù. ÀÌ °ªµéÀº ½Ã½ºÅÛ¿¡ µû¶ó ´Ù¸¦ ¼ö ÀÖ°í, ¾î¶°ÇÑ ÀÌÀ¯·Î Á¤ÀǵǾî ÀÖÁö ¾ÊÀ» ¼öµµ ÀÖ½À´Ï´Ù. ³ª. ¸Þ½ÃÁö Å¥ ÇÔ¼ö ¸Þ½ÃÁö Å¥ÀÇ ÇÔ¼öµéÀº ´ÙÀ½°ú °°½À´Ï´Ù. #include int msgctl(int msqid, int cmd, struct msqid_ds *buf); int msgget(key_t key, int msgflg); int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg); int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg); ¤¡. msgget msgget ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é ¸Þ½ÃÁö Å¥¸¦ »ý¼ºÇϰí Á¢±ÙÇÒ ¼ö ÀÖ½À´Ï´Ù. int msgget(key_t key, int msgflg); 'key' ´Â ´Ù¸¥ IPC ¼³ºñ¿Í ¸¶Âù°¡Áö·Î ƯÁ¤ÇÑ ¸Þ½ÃÁö Å¥¸¦ ÁöĪÇÏ´Â °ªÀÔ´Ï´Ù. Ư¼öÇÑ 'key' °ªÀ¸·Î IPC_PRIVATE °¡ ÀÖ´Â µ¥, À̰ÍÀº ÇÁ·Î¼¼½ºÀÇ °³ÀÎÀûÀΠť¸¦ »ý¼ºÇϰí, ÇöÀçÀÇ ÇÁ·Î¼¼½º¸¸ÀÌ Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï ÇÕ´Ï´Ù. msgflg ÀÇ ÇÏÀ§ 9ºñÆ®´Â 9°³ÀÇ ±ÇÇÑ Ç÷¡±×ÀÔ´Ï´Ù. IPC_CREAT ¿Í ´Ù¸¥ ±ÇÇÑ Ç÷¡±×¸¦ OR ¿¬»êÀ¸·Î »ç¿ëÇÏ¿© »õ·Î¿î ¸Þ½ÃÁö Å¥¸¦ »ý¼ºÇÒ ¼ö ÀÖ½À´Õ´Ï´Ù. msgget ¿¡¼­ IPC_CREAT Ç÷¡±×¸¦ ¼³ Á¤Çϰí ÀÌ¹Ì Á¸ÀçÇÏ´Â ¸Þ½ÃÁö Å¥ÀÇ Å°°ªÀ» ³Ñ°ÜÁÖ´Â °ÍÀº ¿¡·¯´Â ¾Æ´Õ´Ï´Ù. ¸Þ½ÃÁö Å¥°¡ ÀÌ¹Ì Á¸ÀçÇÒ °æ¿ì¿¡ IPC_CREAT Ç÷¡±×¸¦ »ç¿ëÇÏ¸é ±×³É ¹«½ÃµË´Ï´Ù. msgget ÇÔ¼ö°¡ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é Å¥ ½Äº°ÀÚ·Î À½¼ö°¡ ¾Æ´Ñ °ªÀ» ³Ñ°ÜÁÖ°í ¿¡·¯ °¡ ¹ß»ýÇÒ °æ¿ì¿¡´Â -1À» µ¹·ÁÁÝ´Ï´Ù. ¤¤. msgsnd msgsnd ÇÔ¼ö´Â ±× À̸§¿¡¼­µµ ¾Ë ¼ö ÀÖµíÀÌ ¸Þ½ÃÁö Å¥·Î ¸Þ½ÃÁö¸¦ Àü¼ÛÇÏ´Â ¿ªÇÒÀ» ÇÕ´Õ´Ï´Ù. int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg); ¸Þ½ÃÁö¸¦ Àü¼ÛÇÏ´Â µ¥ »ç¿ëµÇ´Â ±¸Á¶Ã¼´Â ´ÙÀ½ µÎ°¡Áö »çÇ×À» ÁؼöÇÏ¿©¾ß ÇÕ´Ï´Ù. ¸ÕÀú, ¸Þ½ÃÁö ±¸Á¶Ã¼´Â ½Ã½ºÅÛÀÇ Á¦ÇѺ¸´Ù´Â Àû¾î¾ß ÇÕ´Ï´Ù. µÎ¹øÂ°´Â long int ÇüÀÇ µ¥ÀÌÅ͸¦ ±¸Á¶Ã¼ÀÇ Ã¹ ¸â¹ö·Î ÇØ¾ß ÇÑ´Ù´Â Á¡ÀÔ´Ï´Ù. À̰ÍÀº ¸Þ½ÃÁö¸¦ ¹Þ´Â ÇÔ ¼ö¿¡¼­ »ç¿ëµÇ´Â ¸Þ½ÃÁö ÇüÀÔ´Ï´Ù. ¸Þ½ÃÁö ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°Àº ÇüÅ·ΠÁ¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù. struct my_message { long int message_type; /* The data you wish to transfer */ } 'message_type' Àº ¸Þ½ÃÁö¸¦ ÁÖ°í¹ÞÀ» ¶§ »ç¿ëµÇ±â ¶§¹®¿¡, ¾ø¾î¼­´Â ¾ÈµÇ°ÚÁÒ? ´ç¿¬È÷ ±¸Á¶Ã¼¿¡´Â À̰ÍÀ» Æ÷ÇÔÇØ¾ß ÇÒ »Ó¸¸ ¾Æ´Ï¶ó, Àû´çÇÑ °ªÀ¸·Î ÃʱâÈ­ ÇÏ¿©¾ß ÇÕ´Ï´Ù. ù¹øÂ° ¸Å°³º¯¼öÀÎ msqid ´Â msgget ÀÌ ¹ÝȯÇÑ ¸Þ½ÃÁö Å¥ ½Äº°ÀÚÀÔ´Ï´Ù. µÎ¹øÂ° ¸Å°³º¯¼öÀÎ msg_ptr Àº º¸³¾ ¸Þ½ÃÁö¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ ÀÔ´Ï´Ù. ¼¼¹øÂ° ¸Å°³º¯¼öÀÎ msg_sz Àº msg_ptr ÀÌ °¡¸£Å°´Â ¸Þ½ÃÁöÀÇ Å©±âÀÔ´Ï´Ù. ¿©±â¿¡¼­ 'long int' ÇüÀÇ Å©±â´Â Æ÷ÇÔµÇÁö ¾Ê½À´Ï´Ù. ³×¹øÂ° ¸Å°³º¯¼öÀÎ msgflg ´Â ¸Þ½ÃÁö Å¥°¡ °¡µæ á´Ù´øÁö, ¸Þ½ÃÁö Å¥ÀÇ ½Ã½ºÅÛ Á¦ÇÑ À» ÃʰúÇÑ´Ù µçÁö ÇÒ ¶§¿¡ ¹ß»ýÇÏ´Â ÀÏÀ» Á¦¾îÇÕ´Ï´Ù. ¸¸ÀÏ, ¸Þ½ÃÁö Å¥°¡ °¡µæ Â÷ °í msgflg ¿¡ IPC_NOWAIT Ç÷¡±×°¡ ¼³Á¤µÇ¾ú´Ù¸é, ÇÔ¼ö´Â ¸Þ½ÃÁö¸¦ º¸³»Áö ¾Ê°í Áï°¢ ¸®ÅÏÇÏ¸ç ¹Ýȯ°ªÀº -1 ÀÌ µË´Ï´Ù. msgflg ¿¡ IPC_NOWAIT °¡ ¼³Á¤µÇ¾î ÀÖÁö ¾Ê´Ù¸é, ¸Þ½ÃÁö¸¦ Àü¼ÛÇÏ´Â ÇÁ·Î¼¼½º´Â Å¥¿¡ ¼­ ºó °ø°£ÀÌ »ý±æ ¶§±îÁö ±â´Ù¸®°Ô µÉ °ÍÀÔ´Ï´Ù. ¼º°øÀûÀ¸·Î ÇÔ¼ö°¡ ¼öÇàµÇ¾ú´Ù¸é 0À» ¹ÝȯÇϰí, ½ÇÆÐÇßÀ» °æ¿ì¿¡´Â -1À» ¹ÝȯÇÕ´Ï´Ù. ÇÔ¼ö È£ÃâÀÌ ¼º°øÇÏ¿´´Ù¸é ¸Þ½ÃÁö µ¥ÀÌÅÍÀÇ º¹»çº»Àº ¸Þ½ÃÁö Å¥¿¡ ÀúÀåµË´Ï´Ù. ¤§. msgrcv msgrcv ÇÔ¼ö´Â ¸Þ½ÃÁö Å¥·Î ºÎÅÍ ¸Þ½ÃÁö¸¦ Àü¼Û¹Þ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg); ù¹øÂ° ¸Å°³º¯¼öÀÎ msqid ´Â msgget ¿¡¼­ ¹ÝȯµÈ ¸Þ½ÃÁö Å¥ ½Äº°ÀÚÀÔ´Ï´Ù. µÎ¹øÂ° ¸Å°³º¯¼öÀÎ msg_ptr Àº ¸Þ½ÃÁö¸¦ Àü¼Û¹Þ¾Æ¼­ ÀúÀåÇÏ°Ô µÉ ±¸Á¶Ã¼¿¡ ´ëÇÑ Æ÷ÀÎ ÅÍÀÔ´Ï´Ù. Àü¼Û¹ÞÀ» ±¸Á¶Ã¼´Â msgsnd ÇÔ¼ö¿¡¼­ ¼³¸íÇÑ °Íó·³ 'long int' ÇüÀ¸·Î ½ÃÀÛÇÕ´Ï´Ù. ¼¼¹øÂ° ¸Å°³º¯¼öÀÎ msg_sz Àº msg_ptr ÀÌ °¡¸£Å°´Â ¸Þ½ÃÁö ÀúÀå¼ÒÀÇ Å©±âÀÔ´Ï´Ù. ÀÌ Å©±â¿¡¼­´Â óÀ½ÀÇ 'long int' ÇüÀÇ Å©±â´Â Á¦¿ÜµË´Ï´Ù. ³×¹øÂ° ¸Å°³º¯¼öÀÎ msgtype Àº 'long int' ÇüÀÔ´Ï´Ù. msgtype Àº ¸Þ½ÃÁö¸¦ Àü¼Û¹ÞÀ» ¶§ °£´ÜÇÑ ¿ì¼±¼øÀ§¸¦ Àû¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. msgtype ÀÌ 0À̶ó¸é, ¸Þ½ÃÁö Å¥¿¡ Àִ ù¹øÂ° À¯È¿ÇÑ ¸Þ½ÃÁö¸¦ Àü¼Û¹Þ°í, 0º¸´Ù Å©´Ù¸é msgtype °ú °°Àº °ªÀ» °¡Áö°í ÀÖ´Â ¸Þ½ÃÁö¸¦ ¹Þ°Ô µÇ°í, 0º¸´Ù ÀÛ´Ù¸é msgtypeÀÇ Àý´ë°ª°ú °°°Å³ª ÀÛÀº ù¹øÂ° ¸Þ½ÃÁö¸¦ ¹Þ°Ô µË´Ï´Ù. ÀÌ·¸°Ô ¼³¸íÇÏ´Ï ½ÇÁ¦ »ç¿ëÇÒ ¶§ º¸´Ù ´õ º¹ÀâÇÏ°Ô º¸ÀÌÁö¸¸, msgtype À» °£´ÜÈ÷ 0À¸ ·Î ¼³Á¤ÇÏ¸é ¸Þ½ÃÁö Å¥¿¡ µé¾î¿Â ¼ø¼­´ë·Î ¸Þ½ÃÁö¸¦ °¡Á®¿Ã ¼ö ÀÖ½À´Ï´Ù. ¾î¶² ƯÁ¤ ÇÑ ¸Þ½ÃÁö¸¸ Àü¼Û¹Þ°íÀÚ ÇÑ´Ù¸é msgtype À» ÇØ´ç °ªÀ¸·Î ¼³Á¤ÇÏ¸é µË´Ï´Ù. n À̳ª n º¸´Ù ÀÛÀº ÇüÅÂÀÇ ¸Þ½ÃÁö¸¸ ¹Þ°íÀÚ ÇÑ´Ù¸é msgtype À» -n À¸·Î ¼³Á¤ÇÏ¸é µË´Ï´Ù. ´Ù¼¸¹øÂ° ¸Å°³º¯¼öÀÎ msgflg ´Â ¸Þ½ÃÁö Å¥¿¡ ÇØ´çÇÏ´Â ÇüÅÂÀÇ ¸Þ½ÃÁö°¡ ¾øÀ» °æ¿ì¿¡ Àü¼Û¹ÞÀ» ¶§±îÁö ±â´Ù¸±Áö¸¦ °áÁ¤ÇÕ´Ï´Ù. msgflg ¿¡ IPC_NOWAIT °¡ ¼³Á¤µÇ¾î ÀÖ´Ù ¸é, È£ÃâÀº Áï½Ã -1 À» µ¹·ÁÁָ鼭 ¹ÝȯÇÒ °ÍÀÔ´Ï´Ù. IPC_NOWAIT °¡ ¼³Á¤µÇ¾î ÀÖÁö ¾Ê´Ù¸é, ÇØ´çÇÏ´Â ÇüÅÂÀÇ ¸Þ½ÃÁö°¡ µµÂøÇÒ ¶§ ±îÁö ±â´Ù¸± °ÍÀÔ´Ï´Ù. msgrcv ÇÔ¼ö°¡ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é, »ç¿ëÀÚ ¹öÆÛ¿¡ Àü¼ÛµÈ ¸Þ½ÃÁöÀÇ ¹ÙÀÌÆ® ¼ö¸¦ ¹Ý ȯÇϰí, »ç¿ëÀÚ°¡ ÇÒ´çÇÑ ¹öÆÛ¸¦ °¡¸£Å°´Â msg_ptr¿¡ ¸Þ½ÃÁö°¡ º¹»çµÇ°í, ¸Þ½ÃÁö Å¥ ¿¡¼­ ÇØ´ç ¸Þ½ÃÁö´Â »èÁ¦µË´Ï´Ù. ¿¡·¯°¡ ¹ß»ýÇßÀ» °æ¿ì¿¡´Â -1À» ¹ÝȯÇÕ´Ï´Ù. ¤©. msgctl ¸¶Áö¸·À¸·Î »ìÆìº¼ ¸Þ½ÃÁö Å¥ ÇÔ¼ö´Â msgctl ÀÔ´Ï´Ù. ÀÌ ÇÔ¼ö´Â °øÀ¯¸Þ¸ð¸®¸¦ Á¦¾î ÇÒ ¶§ »ç¿ëÇÏ´Â ÇÔ¼ö¿Í ¸Å¿ì ºñ½ÁÇÕ´Ï´Ù. int msgctl(int msqid, int command, struct msqid_ds *buf); msqid_ds ±¸Á¶Ã¼´Â ÃÖ¼ÒÇÑ ´ÙÀ½ÀÇ ¸â¹ö¸¦ °¡Áý´Ï´Ù. struct msqid_ds { uid_t msg_perm.uid; uid_t msg_perm.gid; mode_t msg_perm.mode; } ù¹øÂ° ¸Å°³º¯¼öÀÎ msqid ´Â msgget ¿¡¼­ ¹ÝȯµÈ ½Äº°ÀÚÀÔ´Ï´Ù. µÎ¹øÂ° ¸Å°³º¯¼öÀÎ command ´Â ÃëÇÒ ÇൿÀÔ´Ï´Ù. °¡´ÉÇÑ °ªµéÀº ´ÙÀ½°ú °°½À´Ï´Ù. ---------------------------------------------------------------------------- ¸í ·É ¼³ ¸í ---------------------------------------------------------------------------- IPC_STAT ¸Þ½ÃÁö Å¥¿¡ ´ëÇÑ Á¤º¸¸¦ msqid_ds ±¸Á¶Ã¼·Î º¹»çÇÕ´Ï´Ù. IPC_SET msqid_ds ±¸Á¶Ã¼¿¡ ´ã±ä ¸Þ½ÃÁö Å¥¿¡ ´ëÇÑ Á¤º¸¸¦ ÇØ´ç ¸Þ½ÃÁö Å¥ ·Î º¹»çÇÏ¿© °ü·Ã Á¤º¸¸¦ º¯°æÇÕ´Ï´Ù. ÇÁ·Î¼¼½º´Â ÀÌ¿¡ ÇÊ¿äÇÑ ÇØ´ç ±ÇÇÑÀ» °¡Áö°í ÀÖ¾î¾ß ÇÕ´Ï´Ù. IPC_RMID ¸Þ½ÃÁö Å¥¸¦ Á¦°ÅÇÕ´Ï´Ù. ---------------------------------------------------------------------------- msgctl ÇÔ¼ö°¡ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é 0À» ¹ÝȯÇϰí, ½ÇÆÐÇßÀ» °æ¿ì¿¡´Â -1À» ¹ÝȯÇÑ ´Ù. ÇÁ·Î¼¼½º°¡ msgsnd ³ª msgrcv ÇÔ¼ö¿¡¼­ ±â´Ù¸®°í ÀÖ´Â °úÁ¤¿¡¼­ ÇØ´ç ¸Þ½ÃÁö Å¥°¡ »èÁ¦µÈ´Ù¸é °ü·Ã ÇÔ¼ö´Â ½ÇÆÐÇÏ°Ô µË´Ï´Ù. Áö±Ý±îÁö ¸Þ½ÃÁö Å¥¿¡ °ü·ÃÇÑ ÇÔ¼ö¸¦ »ìÆìº¸¾Ò½À´Ï´Ù. ÀÌÁ¦ Áö±Ý±îÁö »ìÆìº» ¸Þ½Ã Áö Å¥¸¦ Å×½ºÆ® ÇÏ´Â ¿¹Á¦¸¦ ¸¸µé¾î º¾½Ã´Ù. ---------------------------------------------------------------------------- /* msg.c : ¸Þ½ÃÁö Å¥ÀÇ ¿¹Á¦ - µÎ°³ÀÇ ÇÁ·Î¼¼½º°£ µ¥ÀÌÅÍ Àü¼Û Å×½ºÆ® */ #include #include #include #include #include #include #include #define MSGKEY 100 struct my_msg_st { long int my_msg_type; char some_text[BUFSIZ]; }; struct my_msg_st some_data; int receiver(key_t msgkey) { int msgid, done = 1; msgid = msgget((key_t)msgkey, 0666 | IPC_CREAT); if (msgid == -1) { fprintf(stderr, "msgget failed\n"); exit(EXIT_FAILURE); } while (done) { if (msgrcv(msgid, (void *)&some_data, BUFSIZ, 0, IPC_NOWAIT) == -1) { if (errno == ENOMSG) { fprintf(stderr, "´õ ÀÌ»ó ¸Þ½ÃÁö°¡ ¾ø½À´Ï´Ù.\n"); } else { fprintf(stderr, "msgrcv ½ÇÆÐ\n"); } exit(EXIT_FAILURE); } printf("¹ÞÀº ¸Þ½ÃÁö: %s", some_data.some_text); if (strncmp(some_data.some_text, ".", 1) == 0) { done = 0; } } if (msgctl(msgid, IPC_RMID, 0) == -1) { fprintf(stderr, "msgctl(IPC_RMID) failed\n"); exit(EXIT_FAILURE); } printf("\n¸Þ½ÃÁö ¼ö½ÅÀ» Á¾·áÇÕ´Ï´Ù.\n\n"); exit(EXIT_SUCCESS); } int sender(key_t msgkey) { int msgid, done = 1; char buffer[BUFSIZ]; msgid = msgget((key_t)msgkey, 0666 | IPC_CREAT); if (msgid == -1) { fprintf(stderr, "msgget failed\n"); exit(EXIT_FAILURE); } printf("Àü¼ÛÇÒ ¸Þ½ÃÁö¸¦ ÀÔ·ÂÇϼ¼¿ä.\n"); printf("¸Þ½ÃÁö ÀÔ·Â Á¾·á´Â ùĭ¿¡ '.'¸¦ ÀÔ·ÂÇϼ¼¿ä.\n\n"); while (done) { printf("Àü¼ÛÇÒ ¸Þ½ÃÁö: "); fgets(buffer, BUFSIZ, stdin); some_data.my_msg_type = 1; strcpy(some_data.some_text, buffer); if (msgsnd(msgid, (void *)&some_data, BUFSIZ, 0) == -1) { fprintf(stderr, "msgsnd failed\n"); exit(EXIT_FAILURE); } if (strncmp(buffer, ".", 1) == 0) { done = 0; } } printf("\n¸Þ½ÃÁö Àü¼ÛÀ» Á¾·áÇÕ´Ï´Ù.\n\n"); exit(EXIT_SUCCESS); } void main(int argc, char *argv[]) { if (argc > 1) { receiver(MSGKEY); } else { sender(MSGKEY); } } ---------------------------------------------------------------------------- ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇØ¼­ ½ÇÇàÇØº¼±î¿ä? $ gcc -o msg msg.c $ msg Àü¼ÛÇÒ ¸Þ½ÃÁö¸¦ ÀÔ·ÂÇϼ¼¿ä. ¸Þ½ÃÁö ÀÔ·Â Á¾·á´Â ùĭ¿¡ '.'¸¦ ÀÔ·ÂÇϼ¼¿ä. Àü¼ÛÇÒ ¸Þ½ÃÁö: À̱ÛÀº ¸Þ½ÃÁöÅ¥·Î Àü¼ÛµË´Ï´Ù. Àü¼ÛÇÒ ¸Þ½ÃÁö: ³ªÁß¿¡ ¼ö½ÅÇØ¼­ º¼ ¼ö ÀÖ½À´Ï´Ù. Àü¼ÛÇÒ ¸Þ½ÃÁö: . ¸Þ½ÃÁö Àü¼ÛÀ» Á¾·áÇÕ´Ï´Ù. queen:~/ipc$ msg r ¹ÞÀº ¸Þ½ÃÁö: À̱ÛÀº ¸Þ½ÃÁöÅ¥·Î Àü¼ÛµË´Ï´Ù. ¹ÞÀº ¸Þ½ÃÁö: ³ªÁß¿¡ ¼ö½ÅÇØ¼­ º¼ ¼ö ÀÖ½À´Ï´Ù. ¹ÞÀº ¸Þ½ÃÁö: . ¸Þ½ÃÁö ¼ö½ÅÀ» Á¾·áÇÕ´Ï´Ù. $ ¸Þ½ÃÁö Å¥¸¦ °£´ÜÇÏ°Ô Å×½ºÆ® ÇØº¸¾Ò½À´Ï´Ù. ¿øÇÏ´Â µ¥·Î Àß µÇ´Â±º¿ä.. ±×·³, ÀÌÁ¦ Áö±Ý±îÁö ¹è¿î ¼¼¸¶Æ÷¾î, °øÀ¯¸Þ¸ð¸®, ¸Þ½ÃÁö Å¥¸¦ ÇÔ²² »ç¿ëÇÏ¿©, ¾Õ¿¡ ¼­ Àá½Ã ¾ð±ÞÇÑ ´ëÈ­¹æ ½Ã½ºÅÛÀ» ¸¸µé¾î º¾½Ã´Ù. $$$$$$$ ¼¼¸¶Æ÷¾î, °øÀ¯¸Þ¸ð¸®, ¸Þ½ÃÁö Å¥¸¦ ÇÔ²² »ç¿ëÇÑ ´ëÈ­¹æ ¸¸µé±â $$$$$$$$ ¾Õ¼­µµ ¸»¾¸µå·ÈÁö¸¸, ´ëÈ­¹æ °°Àº °æ¿ì´Â ¿äÁò socket À̳ª device ¿¡ Á÷Á¢ ¾²±â ¹æ½ÄÀ¸·Î ¸¹ÀÌ ±¸ÇöÇϱ⵵ ÇÕ´Ï´Ù. ÇÏÁö¸¸, ¿©±â¼­´Â IPC ±â´ÉµéÀ» ¸¶Áö¸·À¸·Î ÃÑ Á¤¸® ÇÒ °â, Á» ´õ ¼¶¼¼ÇÑ Á¦¾î°¡ °¡´ÉÇÑ ¼¼¸¶Æ÷¾î, °øÀ¯¸Þ¸ð¸®, ¸Þ½ÃÁö Å¥¸¦ ÇÔ²² »ç¿ëÇϰڽÀ´Ï´Ù. »ç½Ç IPC ¼³ºñµéÀº socket °ú ÇÔ²² ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¡¹Ö ¿¡¼­ ¾ÆÁÖ À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. À̰ÍÀº ¿©·¯ºÐµéÀÌ Á÷Á¢ °æÇèÀ» ÇϽø鼭 ´À²¸ º¸½Ã±â ¹Ù¶ó°Ú½À´Ï´Ù. À§¿¡¼­µµ Àá½Ã ¸»¾¸µå·ÈÁö¸¸, ¸Þ½ÃÁö Àü´ÞÀÇ È¿À²¼ºÀ» À§Çؼ­ ¸Þ½ÃÁö Å¥¸¦ »ç¿ëÇϱ⠷ΠÇÏÁö¿ä. ¾Æ¿ï·¯ Àüü Á¤º¸¸¦ À¯ÁöÇϱâ À§Çؼ­ °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®¸¦ Ȱ¿ëÇϱ⠷ΠÇϰí, °øÀ¯¸Þ¸ð¸®¸¦ ´Ù·ç´Â µ¥¼­ »ý±â´Â ÇÁ·Î¼¼½º µ¿±âÈ­ ¹®Á¦´Â ¼¼¸¶Æ÷¾î¸¦ »ç ¿ëÇÏ¿© ÇØ°áÇϵµ·Ï ÇϰڽÀ´Ï´Ù. ´ÙÀ½ÀÇ ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇϰí ÀÖ´Â ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°½À´Ï´Ù. typedef struct { long int msg_type; pid_t sender_pid; char sender_id[12]; char sender_nick[12]; char text[256]; int text_type; } CHAT; CHAT ±¸Á¶Ã¼´Â ½ÇÁ¦ ´ëÈ­¸¦ ÇÒ ¶§, ¸Þ½ÃÁö ¼Û¼ö½Å¿¡ ÇÊ¿äÇÑ ³»¿ëÀ» ½Ç¾î³ª¸£´Â ¿ª ÇÒÀ» ÇÕ´Ï´Ù. msg_type ¿¡´Â ¼ö½ÅÇÏ´Â ÇÁ·Î¼¼½ºÀÇ ¹øÈ£¸¦ ÁöÁ¤ÇÔÀ¸·Î½á ¼ö½ÅÀÚ¸¦ Çϳª¾¿ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. sender_pid ´Â ¸Þ½ÃÁö¸¦ ¼Û½ÅÇÏ´Â ÇÁ·Î¼¼½ºÀÇ ¹øÈ£ÀÔ ´Ï´Ù. À̰ÍÀº ¸Þ½ÃÁö¸¦ ¼ö½ÅÇÏ´Â ÀÚ½Ä ÇÁ·Î¼¼½º°¡, Á¾·á¸Þ½ÃÁö¸¦ º¸³½ ºÎ¸ðÇÁ·Î¼¼½º ¸¦ È®ÀÎÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. sender_id ¿Í sender_nick ¿Í text ´Â ¼ö½ÅÇÏ´Â ÇÁ·Î ¼¼½º°¡ »ç¿ëÀÚÀÇ È­¸é¿¡ Ãâ·ÂÇÒ ¶§ »ç¿ëµË´Ï´Ù. text_type Àº ´ëÈ­ÀÇ Á¾·ù·Î¼­, ÀÔÀå, ÅðÀå, ±Ó¼Ó¸», ÀϹݴëÈ­ µîÀ» ³ªÅ¸³À´Ï´Ù. ¾Æ·¡ÀÇ Á¤Àǹ®ÀåÀº text_type ¿¡¼­ »ç¿ëµÇ´Â °ÍÀÔ´Ï´Ù. #define JOIN_TEXT 0 /* ÀÔÀå */ #define GEN_TEXT 1 /* ÀϹÝÀûÀÎ ´ëÈ­ */ #define EAR_TEXT 2 /* ±Ó¼Ó¸» */ #define EXIT_TEXT 3 /* ÅðÀå */ typedef struct { char joiner_id[MAX_JOINER][12]; char joiner_nick[MAX_JOINER][12]; pid_t joiner_pid[MAX_JOINER]; /* Âü¿©ÀÚÀÇ ÇÁ·Î¼¼½º ¹øÈ£ */ int cur_joiner_num; } ROOM; ROOM ±¸Á¶Ã¼´Â ´ëÈ­¿¡ Âü¿©ÇÏ´Â ¸ðµç ÇÁ·Î¼¼½º°¡ ÀÐ°í ¾µ ¼ö ÀÖ´Â °øÀ¯¸Þ¸ð¸® ¼¼±× ¸ÕÆ®¿¡ À§Ä¡ÇÒ ³»¿ëÀÔ´Ï´Ù. ÇöÀç ´ëÈ­¿¡ Âü¿©Çϰí ÀÖ´Â »ç¿ëÀÚÀÇ id, º°¸í, ÇÁ·Î ¼¼½º ¹øÈ£ÀÇ ³»¿ëÀ» ´ã°í ÀÖ½À´Ï´Ù. »ç¿ëÀÚÀÇ ´ëÈ­Âü¿© ¹× ÅðÀå¿¡ µû¶ó °è¼Ó µ¥ÀÌ ÅͰ¡ º¯ÇÏ°Ô µË´Ï´Ù. ¹°·Ð, ±¸¹Ì¿¡ µû¶ó ¹æÁ¦¸ñ, Âü¿©ÀοøÁ¦ÇÑ µîÀÇ ³»¿ëÀ» ÷»è ÇÒ ¼ö ÀÖ½À´Ï´Ù. typedef struct { char id[12]; char nick[12]; pid_t pid; } JOINER; JOINER ´Â ÇØ´ç ÇÁ·Î¼¼½º »ç¿ëÀÚÀÇ ±âº» Á¤º¸ÀÔ´Ï´Ù. ¾Æ·¡¿¡¼­, send ´Â ¸Þ½ÃÁö¸¦ Àü¼ÛÇÒ ¶§ »ç¿ëÇϰí, receive ´Â ¸Þ½ÃÁö¸¦ ¼ö½ÅÇÒ ¶§ »ç¿ëÇÕ´Ï´Ù. CHAT send, receive; ROOM room; JOINER joiner; ´ëÈ­¹æÀ» Çϳª·Î ±¸¼ºÇÑ´Ù¸é, °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®µµ Çϳª·Î ÃæºÐÇÕ´Ï´Ù. ¹°·Ð Æí ÀÇ¿¡ µû¶ó ´ëÈ­¹æÀÌ ¿©·¯°³¶óµµ °øÀ¯¸Þ¸ð¸®´Â Çϳª·Î ÇÒ ¼ö ÀÖ°ÚÁö¿ä? ¸Þ½ÃÁö Å¥µµ Çϳª¸¦ »ç¿ëÇϰí, ¿©·¯ ÇÁ·Î¼¼½º·ÎºÎÅÍÀÇ µ¿½Ã Á¢±ÙÀ¸·Î ÀÎÇÑ µ¥ÀÌÅÍ ÀÇ º¸È£¸¦ À§ÇØ ÇϳªÀÇ ¹ÙÀ̳ʸ® ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÏ¿´½À´Ï´Ù. Á¢±ÙÇÏ´Â ¸Þ¸ð¸® ¼¼±×¸ÕÆ®°¡ ¿©·¯°÷ÀÏ °æ¿ì¿¡´Â ¿©·¯°³ÀÇ ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁÀ» °Ì´Ï´Ù. int semid, shmid, msgid; memptr Àº °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®ÀÇ ½ÃÀۺκÐÀ» °¡¸£Åµ´Ï´Ù. char *memptr; ¿©±â¿¡¼­, main °ú ¼¼¸¶Æ÷¾î ÇÔ¼ö¸¦ Á¦¿ÜÇϸé, 4°³ÀÇ ÇÔ¼ö°¡ »ç¿ëµË´Ï´Ù. join_chat_room Àº ´ëÈ­¿¡ Âü¿©ÇÏ´Â ÇÁ·Î¼¼½º°¡ ½ÇÇàÀ» Çϸé, °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ® ÀÇ ³»¿ëÀ» ÀûÀýÇÏ°Ô º¯°æÇÏ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. sender ´Â stdin ¿¡¼­ ´ëÈ­³»¿ëÀ» ÀԷ¹ÞÀ¸¸ç, send_msg ´Â sender ¼öÇàÁß¿¡¼­ ½ÇÁ¦·Î ¸Þ½ÃÁö¸¦ Àü¼ÛÇϱâ À§ÇØ È£Ãâ ÇÕ´Ï´Ù. receiver ´Â ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¼öÇàÇϸç, ¸Þ½ÃÁö Å¥·Î ºÎÅÍ Àڽſ¡°Ô ¿Â ³»¿ëÀ» »ç¿ëÀÚÀÇ È­¸é¿¡ Ãâ·ÂÇÏ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. int receiver(); int send_msg(CHAT *send_msg); int sender(); int join_chat_room(); (°è¼Ó..) ¡º¸®´ª½º Çдç-¸®´ª½º °­Á / ¿¬Àç (go LINUX)¡» 481¹ø Á¦ ¸ñ:[°­ÁÂ6] ½Ã½ºÅÛ V IPC - ¿¹Á¦ ¼Ò½º ¿Ã¸°ÀÌ:ddoch (Çѵ¿ÈÆ ) 97/07/11 23:49 ÀÐÀ½:1992 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- ½ÇÁ¦·Î, ´ëºÎºÐÀÇ ´ëÈ­¹æ ½Ã½ºÅÛÀº ÀԷ°ú Ãâ·ÂÀÌ ºÐ¸®°¡ µÇ¾î ÀÖ½À´Ï´Ù. ´ëÈ­¹æ¿¡¼­ äÆÃÀ» ÇÒ °æ¿ì¸¦ »ý°¢ÇØ º¾½Ã´Ù. ¿ì¸®°¡ ÀÔ·ÂÇÏ´Â °Í°ú´Â º°µµ·Î »ó´ë¹æÀÇ ³»¿ëÀÌ °è¼Ó È­¸é¿¡ Ãâ·ÂµÇ´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ÀÌ·² °æ¿ì¿¡ kbhit À̳ª ±Û¼èÀÔ·ÂÀÌ µÉ ¶§±îÁö ±â´Ù¸®Áö ¾Ê´Â getch ¸¦ »ç¿ëÇÏ¿© ÇØ°áÇÏ´Â °ÍÀº ºñÈ¿À²ÀûÀÌ°í »ó´çÈ÷ Èûµç ÀÛ¾÷ÀÌ µÉ °Í ÀÔ´Ï´Ù. µû¶ó¼­, fork ¸¦ »ç¿ëÇÏ¿© ÀÔ·Â ¹Þ´Â ÇÁ·Î¼¼½º¿Í Ãâ·ÂÇÏ´Â ÇÁ·Î¼¼½º¸¦ ºÐ¸®ÇÏ´Â °Íµµ Çϳª »ý°¢ÇØ º¼ ¼ö ÀÖ´Â ¹æ¹ý À̰ÚÁö¿ä. main ¿¡¼­ º¸¸é, fork Àü±îÁö´Â ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ¼öÇàÇϳª, fork ºÎÅÍ´Â sender ´Â ºÎ¸ðÇÁ·Î¼¼½º°¡, receiver ´Â ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¼öÇàÇÏ¿© ¿ªÇÒÀ» ºÐ¸®Çϰí ÀÖ½À ´Ï´Ù. ÀÚ½ÄÀÌ Á¾·áÇÏ´Â ½ËÁ¡Àº, ºÎ¸ð°¡ ´ëÈ­¹æÀ» ºüÁ®³ª°¡¸é¼­, text_type À¸·Î EXIT_TEXT ¸¦ ÀÚ½ÅÀÇ ÇÁ·Î¼¼½ºÀÇ PID ¿Í ÇÔ²² Àü¼ÛÇÒ ¶§, ÀÚ½Ä ÇÁ·Î¼¼½º´Â ÀÚ½ÅÀÇ ºÎ¸ð ÇÁ·Î¼¼½º°¡ Á¾·áÇÔÀ» È®ÀÎÇϰí wait ÇÏ´Â ºÎ¸ð¿¡°Ô exit ¸¦ ÇÏ´Â ¹æ¹ýÀ¸·Î Á¾ ·á¸¦ ÇÏ°Ô µË´Ï´Ù. ¹°·Ð ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô ƯÁ¤ÇÑ ½Ã±×³ÎÀ» º¸³»¼­ ó¸®ÇÏ´Â ¹æ¹ý µµ ±¦ÂúÀ» °Ì´Ï´Ù. ±× ÀÌÈÄ¿¡ ºÎ¸ð ÇÁ·Î¼¼½º´Â Âü¿©ÀÚ ¼ýÀÚ¸¦ Çϳª ÁÙÀ̰í ÀÚ½ÅÀÌ ¸¶Áö¸· Âü¿©ÀÚÀÌ¸é ½Ã½ºÅÛÀÇ ÀÚ¿øÀ» Á¦°ÅÇϰí Á¾·áÇÏ°Ô µË´Ï´Ù. ¿©±â¼­ ¶ÇÇϳª »ý°¢ÇØ º¼¸¸ÇÑ ¹®Á¦´Â °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®¿¡ ÇöÀç ´ëÈ­¿¡ Âü¿©Çϰí ÀÖ´Â Âü¿©ÀÚÀÇ Á¤º¸¸¦ ¾î¶»°Ô À¯ÁöÇÏ´À³Ä ÇÏ´Â °ÍÀÔ´Ï´Ù. ´ÙÀ½°ú °°ÀÌ °£´ÜÇÏ°Ô »ý°¢ÇØ º¼ ¼ö ÀÖ½À´Ï´Ù. ´ëÈ­¿¡ Âü¿©ÇÏ´Â »ç¶÷À» ¼ø¼­´ë·Î ¸Þ¸ð¸®¿¡ ÀûÀçÇÑ´Ù°í ÇÏ´õ¶óµµ, ÅðÀåÇÒ ¶§´Â ¸ÕÀú µé¾î¿Â »ç¶÷ÀÌ ¸ÕÀú ³ª°¥ ¼öµµ Àֱ⠶§¹®¿¡ ¼øÂ÷ÀûÀ¸·Î Âü¿©ÀÚ Á¤º¸¸¦ °ü¸®ÇÏ´Â °ÍÀº ¹®Á¦°¡ »ý±æ ¼ö ÀÖ½À´Ï´Ù. ¿©±â¼­´Â °£´ÜÇϰÔ, ÀÔÀåÇÏ´Â Âü¿©ÀÚÀÇ Á¤º¸¸¦ Â÷·Ê·Î Àû°í, ÅðÀåÇÒ ¶§¿¡´Â ÇØ´ç ÇÁ·Î¼¼½º ¹øÈ£ (joiner_pid) ¸¦ ã¾Æ¼­ 0¹øÀ¸·Î Ç¥½Ã¸¦ Çϰí, ÇØ´ç À妽ºÀÇ Âü¿© ÀÚ Á¤º¸´Â ¹«½ÃÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇÕ´Ï´Ù. ÀÌÈÄÀÇ »õ·Î¿î Âü¿©ÀÚÀÇ Á¤º¸¸¦ ±â·ÏÇÒ ¶§¿¡´Â joiner_pid ¹è¿­ Áß Ã¹¹øÂ°·Î 0¹øÀÎ ¿£Æ®¸®¸¦ ã¾Æ¼­ »õ·Ó°Ô µ¥ÀÌÅ͸¦ ±â·Ï ÇÕ´Ï´Ù. ¾Æ·¡ÀÇ joiner_pid ¹è¿­ Áß 0¹ø ¿£Æ®¸®´Â ÅðÀåÇÑ Âü¿©ÀÚÀ̰ųª, ¾ÆÁ÷ ºñ¾î ÀÖ´Â °÷ÀÔ´Ï´Ù. cur_joiner_num = 4; +----+----+----+----+----+----+----+----+----+----+----+----+ joiner_pid |251 |253 | 0 |356 | 0 | 0 |562 | 0 | 0 | 0 | 0 | 0 | +----+----+----+----+----+----+----+----+----+----+----+----+ +----+----+----+----+----+----+----+----+----+----+----+----+ joiner_id |aaa |bbb |ccc |ddd |eee |fff |ggg |hhh |iii |jjj |kkk |lll | +----+----+----+----+----+----+----+----+----+----+----+----+ +----+----+----+----+----+----+----+----+----+----+----+----+ joiner_nick |111 |222 |333 |444 |555 |666 |777 |888 |999 |000 |&&& |$$$ | +----+----+----+----+----+----+----+----+----+----+----+----+ [ °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ® ³»ÀÇ Á¤º¸ ] ¸¶Áö¸·À¸·Î, ¼¼¸¶Æ÷¾î¿¡ ´ëÇØ¼­ Àá±ñ »ìÆìº¼±î¿ä? ¿©±â¿¡¼­´Â ½ÇÁ¦ÀûÀ¸·Î °øÀ¯¸Þ¸ð¸®¿¡¼­ À§ÀÇ Á¤º¸¸¦ ÇѲ¨¹ø¿¡ Àоî¿Í¼­ ºÎºÐÀûÀ¸·Î ¼öÁ¤ÇÑ ´ÙÀ½ ´Ù½Ã ÇѲ¨¹ø¿¡ Àû´Â ¹æ¹ýÀ» »ç¿ëÇϱ⠶§¹®¿¡ Áß¿äÇÑ ÀӰ迵¿ªÀº Çϳª ÀÔ´Ï´Ù. µû¶ó¼­ ÀÐ°í ¾µ °æ¿ì¿¡¸¸ ÇϳªÀÇ ÀÌÁø ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÏ¿© ÀӰ迵¿ªÀ» º¸È£ÇÏ´Â ¹æ¹ýÀ» ÃëÇϰí ÀÖ½À´Ï´Ù. µû¶ó¼­ Àб⸸ ÇÏ´Â °æ¿ì¿¡´Â ±»ÀÌ ÀӰ迵¿ªÀ» º¸È£ÇÏÁö ¾Ê¾Æµµ Å« ¹«¸®´Â ¾øÀ» °ÍÀÔ´Ï´Ù. ¾Æ·¡ÀÇ ¼Ò½º¿¡¼­ #ifndef NO_SEMAPHORE ... #endif ºÎºÐÀÌ ÇÁ·Î¼¼½º µ¿±âÈ­¸¦ À§ÇØ ¼¼¸¶Æ÷¾î¸¦ ÷»èÇÑ °÷ÀÌ´Ï Âü°íÇϽñ⠹ٶø´Ï´Ù. ÀÌÁ¦, ¼Ò½º¸¦ ¸¸µé¾î º¾½Ã´Ù. ----------------------------------------------------------------------------- /* * chat.c : system v ipc ±â´ÉÀ» »ç¿ëÇÑ °£´ÜÇÑ ´ëÈ­¹æ ½Ã½ºÅÛ * * Designed by Han-donghun, 1997.7.11 * * E-mail : ddoch@hitel.kol.co.kr * * name : chat.c * * compile : ipc_sem.c ¿Í ÇÔ²² ÄÄÆÄÀÏÇÏ·Á¸é, * * gcc -o chat chat.c ipc_sem.c * * semaphore ¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸·Á¸é, * * gcc -o chat chat.c -DNO_SEMAPHORE * * usage : ./chat * * ¼³¸í : ´ëÈ­¹æ ½Ã½ºÅÛ Áß ¸Þ½ÃÁö Àü¼ÛÀº ¸Þ½ÃÁöÅ¥¸¦ »ç¿ëÇϰí, ÀüüÀûÀÎ * Á¤º¸´Â °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÏ¿´À¸¸ç, ÀӰ迵¿ª º¸È£´Â ¼¼¸¶Æ÷¾î¸¦ * »ç¿ëÇÏ¿´À½. */ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE #endif #ifndef __STDC__ #define __STDC__ #endif #include #include #include #include #include #include #include #include #include #include #include #ifndef NO_SEMAPHORE #include "ipc_sem.h" /* ¼¼¸¶Æ÷¾î ÇÔ¼öµé */ #endif #define MAX_JOINER 12 #define KEY 1 #define CHAT_SIZE (sizeof(CHAT)-sizeof(long int)) /* ÇϳªÀÇ ¸Þ½ÃÁö */ typedef struct { long int msg_type; pid_t sender_pid; char sender_id[12]; char sender_nick[12]; char text[256]; int text_type; } CHAT; /* ´ëÈ­ÀÇ Á¾·ù CHAT.text_type */ #define JOIN_TEXT 0 /* ÀÔÀå */ #define GEN_TEXT 1 /* ÀϹÝÀûÀÎ ´ëÈ­ */ #define EAR_TEXT 2 /* ±Ó¼Ó¸» */ #define EXIT_TEXT 3 /* ÅðÀå */ /* °øÀ¯¸Þ¸ð¸®ÀÇ ´ëÈ­¹æ Á¤º¸ */ typedef struct { char joiner_id[MAX_JOINER][12]; char joiner_nick[MAX_JOINER][12]; pid_t joiner_pid[MAX_JOINER]; /* Âü¿©ÀÚÀÇ ÇÁ·Î¼¼½º ¹øÈ£ */ int cur_joiner_num; } ROOM; /* Âü¿©ÀÚÀÇ ½Å»ó¸í¼¼ */ typedef struct { char id[12]; char nick[12]; pid_t pid; } JOINER; CHAT send, receive; ROOM room; JOINER joiner; #ifndef NO_SEMAPHORE int semid; #endif int shmid; int msgid; /* ¼¼°¡Áö IPC ½Äº°ÀÚ */ char *memptr; /* °øÀ¯¸Þ¸ð¸® ÁÖ¼Ò */ int receiver(); int send_msg(CHAT *send_msg); int sender(); int join_chat_room(); int receiver() { msgid = msgget((key_t)KEY, 0666); if (msgid == -1) { perror("msgget"); return -1; } while (1) { if (msgrcv(msgid, (void *)&receive, CHAT_SIZE, getppid(), 0) == -1) { perror("msgrcv"); return -1; } switch (receive.text_type) { case JOIN_TEXT : printf(" *** %s(%s:%s) ´ÔÀÌ µé¾î¿À¼Ì½À´Ï´Ù!!\n", receive.sender_nick, receive.sender_id, receive.sender_nick); break; case GEN_TEXT : if (receive.sender_pid == getppid()) { printf(" \033[7m%-8s\033[m(%s) %s\n", receive.sender_id, receive.sender_nick, receive.text); } else { printf(" %-8s(%s) %s\n", receive.sender_id, receive.sender_nick, receive.text); } break; case EAR_TEXT : printf(" \033[7m(±Ó¼Ó¸»)\033[m %-8s(%s) %s\n", receive.sender_id, receive.sender_nick, receive.text); break; case EXIT_TEXT : printf(" *** %s(%s) ´ÔÀÌ ³ª°¡¼Ì½À´Ï´Ù.\n", receive.sender_id, receive.sender_nick); if (receive.sender_pid == getppid()) { shmdt(memptr); usleep(200000); /* ºÎ¸ð°¡ ±â´Ù¸± ½Ã°£Àû ¿©À¯ */ exit(1); } break; } memset((void *)&receive, 0, sizeof(CHAT)); #ifdef DEBUG memcpy((void *)&room, (void *)memptr, sizeof(ROOM)); printf("cur_joiner_num = %d\n", room.cur_joiner_num); { int i; for (i = 0; i < MAX_JOINER; i++) { if (room.joiner_pid[i] != 0) { printf("joiner_nick = %s , joiner_pid = %d\n", room.joiner_nick[i], room.joiner_pid[i] ); } } /* for */ } #endif } /* while */ } int send_msg(CHAT *send_msg) { int i; /* °øÀ¯¸Þ¸ð¸®¿¡¼­ Á¤º¸¸¦ Àоî¿À±â */ memcpy((void *)&room, (void *)memptr, sizeof(ROOM)); send_msg->sender_pid = joiner.pid; strcpy(send_msg->sender_id, joiner.id); strcpy(send_msg->sender_nick, joiner.nick); for (i = 0; i < MAX_JOINER; i++) { if (room.joiner_pid[i] != 0) { send_msg->msg_type = room.joiner_pid[i]; if (msgsnd(msgid, (void *)send_msg, CHAT_SIZE, 0) == -1) { perror("msgsnd"); exit(1); } } /* if 0 */ } return 0; } int sender() { char buffer[60]; int done = 0; int status, delete; msgid = msgget(KEY, 0666 | IPC_CREAT); if (msgid == -1) { perror("msgget"); return -1; } send.text_type = JOIN_TEXT; send_msg(&send); while (!done) { fgets(buffer, 60, stdin); buffer[strlen(buffer)-1] = '\0'; if (strcmp(buffer, "/q") == 0) { /* ÅðÀåÇϱâ À§ÇÑ ¿©·¯°¡Áö Áغñ 1. ÀÚ½ÅÀÇ ÅðÀå¸Þ½ÃÁö¸¦ ¸¶Áö¸·À¸·Î º¸³½´Ù. 2. ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô Á¾·á ¸Þ½ÃÁö ÀÚ½ÄÀº ¸Þ½ÃÁö¸¦ ¼ö·ÉÇϰí, °øÀ¯¸Þ¸ð¸®¿Í Á¢¼ÓÀ» ²÷°í ºÎ¸ðÇÁ·Î¼¼½º¿¡°Ô ±Í°¡ 3. °øÀ¯¸Þ¸ð¸® room ¿¡¼­ cur_joiner_num À» Çϳª °¨¼Ò½ÃŲ´Ù. 4. ºÎ¸ð´Â wait ¸¦ ¼öÇàÇÑ´Ù. 5. °øÀ¯¸Þ¸ð¸®¿ÍÀÇ Á¢¼ÓÀ» ²÷°í Á¾·áÇÑ´Ù. */ send.text_type = EXIT_TEXT; send_msg(&send); #ifndef NO_SEMAPHORE p(semid); /* ÀÐ°í ¾²±â À§ÇØ ¼¼±×¸ÕÆ®¿¡ Á¢±ÙÇÏ´Â ÀӰ迵¿ªÀÇ ½ÃÀÛ ºÎºÐ */ #endif memcpy((void *)&room, (void *)memptr, sizeof(ROOM)); for (delete = 0; delete < MAX_JOINER; delete++) { if (joiner.pid == room.joiner_pid[delete]) { room.joiner_pid[delete] = 0; break; } } room.cur_joiner_num--; memcpy((void *)memptr, (void *)&room, sizeof(ROOM)); #ifndef NO_SEMAPHORE v(semid); /* ÀӰ迵¿ªÀÇ Ãⱸ */ #endif wait(&status); shmdt(memptr); if (room.cur_joiner_num == 0) { /* ½Ã½ºÅÛ ÀÚ¿ø Á¦°Å */ #ifndef NO_SEMAPHORE delsem(semid); #endif shmctl(shmid, IPC_RMID, (struct shmid_ds *)0); msgctl(msgid, IPC_RMID, 0); } done = 1; } else { send.text_type = GEN_TEXT; strcpy(send.text, buffer); send_msg(&send); } } return 0; } int join_chat_room() { int empty; #ifndef NO_SEMAPHORE /* ¼¼¸¶Æ÷¾î ÃʱâÈ­ */ if ((semid = initsem(KEY)) < 0) { perror("initsem"); exit(1); } #endif if ((shmid = shmget(KEY, 1024, 0666|IPC_CREAT|IPC_EXCL)) < 0) { if (errno == EEXIST) { /* ÀÌ¹Ì ¹æÀÌ ¸¸µé¾îÁ® ÀÖÀ» °æ¿ì */ shmid = shmget(KEY, 1024, 0666|IPC_CREAT); } if ((memptr = shmat(shmid, (char *)0, 0)) == (char *)-1) { perror("shmat"); exit(1); } } else { /* ¹æÀ» óÀ½À¸·Î ¸¸µé¾úÀ» °æ¿ì */ if ((memptr = shmat(shmid, (char *)0, 0)) == (char *)-1) { perror("shmat"); exit(1); } /* ¹æ¿¡ ´ëÇÑ Á¤º¸¸¦ ÃʱâÈ­ ÇÑ´Ù. */ memset((void *)&room, 0, sizeof(ROOM)); memset((void *)memptr, 0, 1024); } #ifndef NO_SEMAPHORE p(semid); /* ÀӰ迵¿ªÀÇ Ãⱸ */ #endif memcpy((void *)&room, (void *)memptr, sizeof(ROOM)); if (room.cur_joiner_num >= MAX_JOINER) { printf("´ëÈ­¹æÀÇ Á¤¿øÀÌ Ã¡½À´Ï´Ù.\n"); exit(1); } /* °øÀ¯¸Þ¸ð¸®³»¿¡¼­ ºñ¾îÀÖ´Â ÇÁ·Î¼¼½º Å×ÀÌºí ¿£Æ®¸® ã±â */ for (empty = 0; empty < room.cur_joiner_num; empty++) { if (room.joiner_pid[empty] == 0) /* ºó Ç׸ñ */ break; } strcpy(room.joiner_id[empty], joiner.id); strcpy(room.joiner_nick[empty], joiner.nick); room.joiner_pid[empty] = joiner.pid; room.cur_joiner_num++; memcpy((void *)memptr, (void *)&room, sizeof(ROOM)); #ifndef NO_SEMAPHORE v(semid); /* ÀӰ迵¿ªÀÇ Ãⱸ */ #endif return 0; } void main() { pid_t receiver_pid; setbuf(stdout, NULL); /* Âü¿©ÀÚ Á¤º¸ ¾ò±â */ strcpy(joiner.id, getenv("LOGNAME")); joiner.pid = getpid(); printf(" º°¸í : "); fgets(joiner.nick, 12, stdin); joiner.nick[strlen(joiner.nick)-1] = '\0'; join_chat_room(); if ((receiver_pid = fork()) < 0) { perror("fork"); } else if (receiver_pid > 0) { /* parent sender process */ sender(); } else { /* child sender process */ receiver(); } } ----------------------------------------------------------------------------- À§ÀÇ ´ëÈ­¹æ ±â´ÉÀ» Á» ´õ Ãß°¡ÇÏ¿© ±×·² µí ÇÏ°Ô Çѹø ¸¸µé¾î º¸½Ã±æ ¹Ù¶ø´Ï´Ù. ¾Æ¿ï·¯ curses ³ª X À©µµ¿ì À§Á¬À» ÀÔÇô¼­ Á» ´õ Æí¸®ÇÏ°Ô »ç¿ëÇÒ ¼öµµ ÀÖÀ» °ÍÀÔ´Ï ´Ù. Áö±Ý±îÁö, IPC ±â´ÉÀ» »ç¿ëÇÏ¿© ¾µ¸¸ÇÑ ¿¹Á¦¸¦ Çϳª ¸¸µé¾î º¸¾Ò½À´Ï´Ù. 6. ³ª¿À´Â ¸» ³¯¾¾°¡ Á¡Á¡ ¹«´õ¿ö Áö´Â °Í °°±º¿ä. -.-;;; ¿©·¯ºÐµéÀÌ °øºÎÇÏ´Â ºÎºÐ¿¡ Á» µµ¿òÀÌ µÆÀ» Áö ¸ð¸£°Ú±º¿ä. ¾Æ¹¸´ø IPC ¸¦ »ç¿ëÇÏ¿© ±Ù»çÇÑ ÇÁ·Î±×·¥À» Çϳª Â¥º¸½Ã±â ¹Ù¶ø´Ï´Ù. Á» ¾û¼ºÇϱä ÇÏÁö¸¸, IPC (¼¼¸¶Æ÷¾î, °øÀ¯¸Þ¸ð¸®, ¸Þ½ÃÁö Å¥)°­Á´ À̰ÍÀ¸·Î ¸¶Ä¡ ±â·Î ÇϰڽÀ´Ï´Ù. ±×·³, ¾È³çÈ÷~~ ddoch Çѵ¿ÈÆ µå¸²