ºñµ¿±â ÀÔÃâ·Â
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.



ºñµ¿±â ÀÔÃâ·Â(½Ã±×³Î)

1절. ¼Ò°³

À̹øÀº ¸®´ª½º(À¯´Ð½º) ÀÔÃâ·Â ¸ðµ¨ Áß ºñµ¿±â ÀÔÃâ·Â ¸ðµ¨¿¡ ´ëÇØ¼­ ´Ù·ç¸ç, ºñµ¿±â ÀÔÃâ·Â ¸ðµ¨Áß ÀϹÝÀûÀÎ signal À» ÀÌ¿ëÇÑ ±¸Çö¿¡ ´ëÇØ¼­ ´Ù·é´Ù.

º¸Åë signal À» »ç¿ëÇÏ°Ô µÉ°æ¿ì À̰ÍÀú°Í °í·ÁÇØ¾ßµÉ »çÇ×ÀÌ ¸¹°í ´Ù·ç±â°¡ ²Ï ±î´Ù·Î¿ì¸ç, signal ÀÚü°¡ °¡Áö´Â ¿©·¯°¡Áö Á¦¾à»çÇ×µé ¶§¹®¿¡ signal + ºñµ¿±â ÀÔÃâ·Â Àº ±×¸® ¸¹ÀÌ ¾²ÀÌ´Â ÆíÀº ¾Æ´Ï´Ù. ¿À·¡µÈ ¸î°¡Áö µð¹ÙÀ̽º(±â±â)¸¦ ´Ù·ç´Â ÇÁ·Î±×·¥µé ¼Ò¼öÀÇ ÇÁ·Î±×·¥°ú »ç¿ëÀÚ ÀÔ·ÂÀ» ó¸®ÇÏ´Â ¸î°¡Áö »ç¿ëÀÚ ¾îÇø®ÄÉÀ̼ǿ¡¼­ °£È¤ »ç¿ëµÈ´Ù. º¸ÅëÀÇ °æ¿ì´Â select, poll °ú °°Àº ´Ù¸¥ ´ëü°¡´ÉÇϸ鼭µµ ºñ±³Àû ±¸ÇöÀÌ °£´ÜÇÑ °ÍµéÀ» ÀÌ¿ëÇÑ´Ù.

±×·¸Áö¸¸ ¾î¶µç ÀÌ·± ¸ðµ¨ÀÌ ÀÖ´Ù´Â °Íµµ ¾Ë¾ÆµÎ¸é µµ¿òÀÌ µÈ´Ù. (Àû¾îµµ ÀÔÃâ·Â ¸ðµ¨À» ¼±ÅÃÇϰíÀÚ ÇÒ¶§ ¹«¾ó ¼±ÅÃÇØ¾ß ÇÒÁö) ƯÈ÷ ÀÌ ¸ðµ¨Àº signal ÀÇ ´ÜÁ¡À» º¸¿ÏÇÑ realtime signal °ú ºñµ¿±â ÀÔÃâ·Â Á¶ÇÕ ¸ðµ¨ÀÇ ±âº»ÀÌ µÊÀ¸·Î, realtime OS/¾îÇø®ÄÉÀÌ¼Ç ¿¡ °ü½ÉÀÌ ÀÖ´Ù¸é ¾Ë¾ÆµÎ´Â°Ô ¸¹Àº µµ¿òÀÌ µÉ°ÍÀÌ´Ù.


2절. ºñµ¿±â ÀÔÃâ·Â

2.1절. ºñµ¿±â ÀÔÃâ·Â¿¡ ´ëÇØ¼­

ºñµ¿±âÀÔÃâ·ÂÀº ¿µ¾î·Î Asynchronous I/O ¶ó°í ºÒ¸®¿î´Ù. Asynchronous´Â µ¿½Ã¼ºÀ» °¡Áö°í ÀÖÁö ¾ÊÀº(ÞªÔÒÑ¢)À̶ó´Â ¶æÀ» °¡Áö°í ÀÖ´Ù. °£´ÜÈ÷ ¸»ÇÏÀÚ¸é "½Ã°£À» ÀÏÄ¡½Ãų¼ö ¾ø´Â" À̶õ ¶æÀ¸·Î ÇØ¼®ÇÒ¼ö ÀÖÀ¸¸ç, ºñµ¿±â ÀÔÃâ·ÂÀ̶õ ÀԷ°ú Ãâ·Â½Ã°£À» ÀÏÄ¡½Ãų¼ö ¾ø´Â Áï ¾ðÁ¦ ÀԷ°ú Ãâ·ÂÀÌ ÀϾÁö¸¦ ¾Ë¼ö ¾ø´Â ÀÔ/Ãâ·Â ¸ðµ¨À» ¶æÇÑ´Ù.

±×·¸´Ù¸é ÇѰ¡Áö ¹®Á¦Á¡ÀÌ ´«¿¡ º¸ÀϰÍÀÌ´Ù. ¾ðÁ¦ ¹®Á¦°¡ ¹ß»ýÇÒÁö ¸ð¸¥´Ù¸é(ÀÔ/Ãâ·Â) ¾î¶»°Ô ÀÔÃâ·ÂÀ» ó¸®ÇÒ¼ö ÀÖÀ»°ÍÀΰ¡ ÇÏ´Â ¹®Á¦ ÀÌ´Ù. ºñµ¿±â ÀÔÃâ·Â¿ÜÀÇ µ¿±âÀÔÃâ·Â¿¡¼­¶ó¸é ÀÌ·¯ÇÑ ¹®Á¦´Â ¹ß»ý ÇÒ¼ö ¾øÀ»°ÍÀÌ´Ù. ¿Ö³ÄÇϸé ÀԷ°ú Ãâ·ÂÀÇ ½Ã°£À» ¾Ë¼ö Àֱ⠶§¹®ÀÌ´Ù. - º¸Åë µ¿±â ÀÔÃâ·ÂÀº ÇØ´ç¿µ¿ª¿¡ ÀÔÃâ·ÂÀÌ ÀÖÀ»¶§±îÁö ±â´Ù¸°´Ù -

°¡Àå °£´ÜÇÏ°Ô »ý°¢ÇÒ¼ö ÀÖ´Â ¹æ¹ýÀº ÀԷ°ú Ãâ·ÂÀÌ »ý°åÀ»¶§ ÇÁ·Î¼¼½º¿¡¼­ Áö±Ý ÀÔ·Â(ȤÀº Ãâ·Â)ÀÌ °¨Áö µÇ¾úÀ¸´Ï È®ÀÎÀ» ÇØº¸¶ó°í ½ÅÈ£¸¦ º¸³»´Â °ÍÀÌ µÉ°ÍÀÌ´Ù. À̰ÍÀº ÀÏ»ó»ýȰ¿¡¼­ÀÇ ÀüÈ­¸¦ ´ë±âÇÏ´Â °Í°ú ºñ½ÁÇÏ´Ù. º¸Åë »ç¹«½Ç¿¡¼­ ÀÏÇÒ¶§ ¿ì¸®´Â ÀüÈ­°¡ ¾ðÁ¦ ¿ÃÁö ¾Ë¼ö ¾ø´Ù(½ºÄÉÁÙ °ü¸®¸¦ ÇÏÁö ¾ÊÀ»°æ¿ì). ±×·¸´Ù¸é ÀüÈ­°¡ ¿Ã°æ¿ì ÀüÈ­°¡ ¿Ô´Ù´Â °ÍÀ» ¾î¶»°Ô ÀüÈ­¹ÞÀ» ´ç»çÀÚ¿¡°Ô Å뺸ÇÒ¼ö Àִ°¡. ±×°ÇÀº ÀüÈ­º§ À̶ó´Â "½ÅÈ£"¸¦ ÅëÇØ¼­ °¡´ÉÇÏ´Ù. À¯´Ð½º¿¡¼­´Â ÀÌ·¯ÇÑ ºñµ¿±âÀû »óȲÀ» À§Çؼ­ "signal" À» ÀÌ¿ëÇÑ´Ù.


2.2절. ºñµ¿±â ÀÔÃâ·ÂÀÇ Çü½Ä

ºñµ¿±â ÀÔÃâ·ÂÀº ´ÙÀ½°ú °°Àº ±¸Çö¸ðµ¨À» µû¸¥´Ù.

   application                            kernel
+-->+---->----+                        no data ready 
|   | WORK    |                             |                
|   |         |                             |
|   |         |                             |
|   +----<----+                             |          
|                       signal              | 
|   +---------+  <--------------------- data ready
|   | Event   |                             
|   | Handler |                             
|   | read()  |  ----------------------> copy data   
|   | data    |  <---------------------- copy ¿Ï·á
|   +---------+
|        |
+--------+
			
¾îÇø®ÄÉÀ̼ÇÀº ƯÁ¤ÇÑ ÀÛ¾÷À» ¿¬¼ÓÀûÀ¸·Î Çϰí ÀÖÀ»°ÍÀÌ´Ù(WORK). ¹°·Ð ÀÌ·¯ÇÑ Æ¯Á¤ÇÑ ÀÛ¾÷À» Çϰí ÀÖ´Â µµÁß¿¡ kernel ·ÎºÎÅÍÀÇ ÀÔÃâ·Â°ü·Ã signal À» ¹Þ±â À§Çؼ­, °ü½ÉÀÖ´Â ÆÄÀÏÁöÁ¤ÀÚ¿¡ ´ëÇØ¼­ async ÇÏ°Ô ÀÛµ¿À» Ç϶ó°í ¼³Á¤À» ÇØµÐ »óÅÂÀÌ´Ù.

±×·¯´Ù°¡ ÇØ´ç ÆÄÀÏÁöÁ¤ÀÚ¿¡ ´ëÇØ¼­ ÀÔ/Ãâ·Â »ç°ÇÀÌ ¹ß»ýÇϸé Ä¿³ÎÀº ¾îÇø®ÄÉÀ̼ǿ¡°Ô signal À» º¸³»¼­ ÀÔ/Ãâ·ÂÀÌ ¹ß»ýÇßÀ½À» Å뺸ÇÏ°Ô µÉ°ÍÀÌ´Ù. ±×·³ ¾îÇø®ÄÉÀ̼ÇÀº ¹Ì¸® ÁغñÇØµÐ event handler ¸¦ ÀÌ¿ëÇØ¼­ ÇØ´ç ÆÄÀÏÁöÁ¤ÀÚ·Î ºÎÅÍ ÆÄÀÏÀ» ÀоîµéÀ̰í ÁöÁ¤ÇÑ ÀÛ¾÷À» ÇÏ°Ô µÉ°ÍÀÌ´Ù. ÀÛ¾÷À» ¸ðµÎ ¸¶Ä£´ÙÀ½¿¡´Â event handler ´Â ¸®ÅÏÀ» ÇÏ°Ô µÇ°í ¾îÇø®ÄÉÀ̼ÇÀº ÇØ´ç ÀÛ¾÷À» °è¼Ó ¼öÇàÇÏ°Ô µÉ°ÍÀÌ´Ù.

event handler ÀÌ ÁÖ·Î ÇÏ´ÂÀÏÀº ³×Æ®¿÷À¸·Î ¿¬°áµÈ ¼ÒÄÏÁöÁ¤¹øÈ£·Î ºÎÅÍ µ¥ÀÌŸ¸¦ Àоî¿Í¼­ Àû´çÈ÷ ó¸®ÇÏ´Â ÀÏÀÏ °ÍÀÌ´Ù.


2.3절. ºñµ¿±â ÀÔÃâ·ÂÀ» À§Çؼ­ »ç¿ëµÇ´Â ½ÅÈ£

À§¿¡¼­ ºñµ¿±â ÀÔÃâ·ÂÀÇ ºñµ¿±â»ç°ÇÀÇ Àü´ÞÀ» À§Çؼ­ À¯´Ð½º´Â signal À» ÀÌ¿ëÇÑ´Ù°í Çß¾ú´Ù. ±×·¸´Ù¸é ¾î¶² signal À» »ç¿ëÇÒ°ÍÀÎÁö ¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

À¯´Ð½º´Â SRV4 ¿Í BSD ¾î´À ¸ðµ¨À» µû¸£´À³Ä¿¡ µû¶ó »ç¿ëÇÏ´Â ½Ã±×³ÎÀÇ Á¾·ù°¡ ¾à°£ ´Ù¸£´Ù. SRV4 À¯´Ð½º¶ó¸é SIGPOLL À» »ç¿ëÇÒ°ÍÀ̸ç, BSD ¸ðµ¨À» µû¸¥´Ù¸é SIGIO¿Í SIGURG Á¶ÇÕÀ» µû¸£°Ô µÈ´Ù.

Linux ´Â ±âº»ÀûÀ¸·Î SRV4 ¿Í BSD ¸ðµÎ¸¦ µû¸¥´Ù. °¢°¢ÀÇ ÀåÁ¡À» ¼ö¿ëÇß´Ù°í º¼¼ö Àִµ¥, ƯÈ÷ BSD¿¡ Á»´õ °¡±õ°Ô ¼³°èµÇ¾î ÀÖ´Ù. Linux ´Â SIGIO ¸¦ ¹Þ¾ÆµéÀδÙ.


2.4절. ºñµ¿±â ÀÔÃâ·Â ±¸Çö

2.4.1절. ÆÄÀÏÁöÁ¤ÀÚ¸¦ ºñµ¿±âÀÔÃâ·Â ¹æ½ÄÀ¸·Î º¯°æ

ºñµ¿±â ÀÔÃâ·ÂÀ» À§Çؼ­´Â °ü½ÉÀÖ´Â ÆÄÀÏÁöÁ¤ÀÚ¸¦ ºñµ¿±â ¸ðµå·Î º¯°æ½ÃÄÑ¾ß ÇÑ´Ù.

open(2)µîÀÇ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ÆÄÀÏÀ» ¿­¿´À»°æ¿ì ÇØ´ç ÆÄÀÏÁöÁ¤ÀÚ´Â Sync(µ¿±â) ¸ðµå·Î ÁöÁ¤µÈ´Ù. ±×·³À¸·Î ºñµ¿±â ¸ðµå·Î º¯°æÇϱâ À§Çؼ­´Â fcntl(2)µîÀÇ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ºñµ¿±â ¸ðµå·Î º¯°æ ½ÃÄÑÁÖ¾î¾ß ÇÑ´Ù. fcntl ÇÔ¼öÀÇ »ç¿ë¹ý¿¡ ´ëÇØ¼­´Â fcntl »ç¿ëÇϱ⠿¡ ÀÚ¼¼ÇÏ°Ô ¼³¸íµÇ¾î Àִµ¥, ÀÌ ¹®¼­¸¦ Âü°íÇϱ⠹ٶõ´Ù.


2.4.2절. ½Ã±×³Î Çڵ鷯 Áغñ

ÆÄÀÏÁöÁ¤ÀÚ¸¦ ºñµ¿±âÀÔÃâ·Â ¸ðµå·Î º¯°æÇß´Ù¸é, ÀÌÁ¦ ½Ã±×³ÎÀÌ ¹ß»ýÇßÀ»¶§ ½Ã±×³ÎÀ» ó¸®ÇؾßÇÒ Çڵ鷯¸¦ ÁغñÇØÁÖ¸é µÈ´Ù. ÀÌ Çڵ鷯´Â ÇØ´ç ¾î´À ÆÄÀÏÁöÁ¤ÀÚ¿¡ ÀÐÀ»µ¥ÀÌŸ°¡ ÀÖ´ÂÁö È®ÀÎÀ» ÇÑÈÄ ÇØ´ç ÆÄÀÏÁöÁ¤ÀÚ¿¡¼­ µ¥ÀÌŸ¸¦ Àоî¿Í¼­ À̸¦ ó¸®ÇÏ´Â ÀÏÀ» ÇÏ°Ô µÉ°ÍÀÌ´Ù.

½Ã±×³Î Çڵ鷯´Â SIGIO ¿¡ ´ëÇØ¼­ ÁغñÇÏ¸é µÈ´Ù.


2.4.3절. ±¸Çö½Ã ¸î°¡Áö ÁÖÀÇÇØ¾ßÇÒ ¹®Á¦Á¡

ºñ·Ï ¿©·¯°³ÀÇ ÆÄÀÏÁöÁ¤ÀÚ·Î ºÎÅÍ ÀÔ·ÂÀÌ µé¾î¿Â´Ù°í ÇÏ´õ¶óµµ ¿ÀÁ÷ ÇϳªÀÇ ½ÅÈ£¸¸À» »ç¿ëÇÒ¼ö ÀÖÀ½À¸·Î, °á°úÀûÀ¸·Î ¾î¶² ÆÄÀÏÁöÁ¤ÀÚ·Î ºÎÅÍ ÀÔ·ÂÀÌ ÀÖ¾ú´ÂÁö¸¦ ¾Ë¼ö°¡ ¾ø´Ù. ±×·³À¸·Î ¸ðµç ÆÄÀÏÁöÁ¤ÀÚ¸¦ µÚÁ®¼­ ¾î¶² ÆÄÀÏÁöÁ¤ÀÚ¿¡ Àб⠵¥ÀÌŸ°¡ ÀÖ´ÂÁö È®ÀÎÇÒ¼ö¹Û¿¡ ¾ø´Ù.

½Ã±×³ÎÀÇ Æ¯¼º¶§¹®¿¡ ¹ß»ýÇÒ¼ö ÀÖ´Â ¹®Á¦Àε¥, ½Ã±×³ÎÀÌ ¹ß»ýÇØ¼­ ½Ã±×³Î Çڵ鷯¸¦ ¼öÇàÇϰí ÀÖÀ»¶§ µ¿ÀÏÇÑ ½Ã±×³ÎÀÌ ´Ù½ÃÇѹø ¹ß»ýÇÑ´Ù¸é ºñ·Ï ½Ã±×³Î Çڵ鷯°¡ ¼öÇàÁß¿¡ ÀÖ´Ù°í ÇÏ´õ¶óµµ ó¸®Áß¿¡ ºüÁ®³ª¿Í ¹ö¸°´Ù. ±×·³À¸·Î ¹Ýµå½Ã ½Ã±×³Î Çڵ鷯¸¦ ó¸®ÇÒ¶§´Â µ¿ÀÏÇÑ ½Ã±×³Î¿¡ ´ëÇØ¼­ Àá±ÝÀ» °É¾îÁà¾ß ÇÑ´Ù.

½Ã±×³ÎÀº ±âº»ÀûÀ¸·Î ´ë±â¿­À» °¡ÁöÁö ¸øÇϸç, Çѹø¿¡ ÇϳªÀÇ ½Ã±×³ÎÁ¤º¸¸¸À» À¯ÁöÇÒ¼ö ÀÖ´Ù. ±×·³À¸·Î ÇØ´ç ½Ã±×³ÎÀÌ ¹ß»ýÇØ¼­ Çڵ鷯¸¦ »ç¿ëÇϰí ÀÖ´ÂÁß¿¡ µ¿ÀÏÇÑ ½Ã±×³ÎÀÌ 2°³ÀÌ»ó ¹ß»ýÇÑ´Ù¸é ½Ã±×³ÎÀ» ÀÒ¾î¹ö¸®°Ô µÈ´Ù - ¸¶Áö¸· ½Ã±×³Î¸¸À» À¯ÁöÇÑ´Ù -. ÀÌ´Â ¸Å¿ì ¹Ù»Û ¼­¹ö¿¡¼­ µ¥ÀÌŸ¸¦ ÀÒ¾î¹ö¸±¼öµµ ÀÖÀ½À» ÀǹÌÇÑ´Ù. À̹®Á¦¸¦ ÇØ°áÇϱâ À§ÇÑ ¸î°¡Áö ¹æ¹ýµéÀÌ ÀÖ±äÇÏÁö¸¸, ¿ÏÀüÇÑ ÇØ°áÃ¥Àº ¾ø´Ù. ¸Å¿ì ¹Ù»Û ¼­¹öÀÌ°í µ¥ÀÌŸ¸¦ ÀÒ¾î¹ö¸®´Â ¹®Á¦°¡ ½É°¢ÇÒ¼ö ÀÖ´Ù¸é ºñµ¿±â ÀÔÃâ·ÂÀ» »ç¿ëÇØ¾ß ÇÏ´ÂÁö¿¡ ´ëÇØ¼­ °í¹ÎÇØ¾ß ÇÒ °ÍÀÌ´Ù.

¿ª½Ã ½Ã±×³ÎÀÇ Æ¯¼º¶§¹®¿¡ ¹ß»ýÇÒ¼ö ÀÖ´Â ¹®Á¦Àε¥, ½Ã±×³Î Çڵ鷯°¡ ½ÇÇàµÇ°í ÀÖ´Â µ¿¾ÈÀº ½Ã±×³Î Çڵ鷯¸¦ È£ÃâÇÑ ¿µ¿ª¿¡¼­ ºí·°µÈ´Ù¶ó´Â Á¡ÀÌ´Ù. ±×·³À¸·Î ½Ã±×³Î Çڵ鷯ÀÇ Ã³¸® ½Ã°£ÀÌ ±æ¸é ±æ¼ö·Ï, ±× ½Ã°£µ¿¾È ´Ù¸¥ ÀÔ/Ãâ·ÂÀ» ó¸® ¸øÇÒ È®·üÀÌ Ä¿ÁüÀ¸·Î ¾îÇø®ÄÉÀ̼ÇÀÇ È¿À²À» ¶³¾îÆ®¸±¼ö ÀÖ´Ù. ±×·± ÀÌÀ¯·Î °¡±ÞÀûÀÌ¸é ½Ã±×³Î Çڵ鷯´Â ªÀº ½Ã°£¿¡ ÀÛ¾÷À» ³¡³»µµ·Ï ÇØ¾ß ÇÑ´Ù. ½Ã±×³Î Çڵ鷯´Â Á¶°Çº¯¼ö¸¦ ÀÌ¿ëÇØ¼­ ÀÔ·ÂÀ» ´Ù·ç´Â ¾²·¹µå¸¦ ±ú¿ö¼­ ¿øÇÏ´Â ÀÛ¾÷À» ÇÒ¼ö ÀÖµµ·Ï ÇØÁÖ°í, °ð¹Ù·Î ¸®ÅÏÇÏ´Â ¹æ¹ýÀÌ °¡Àå ¹«³­ÇÒ°Í °°´Ù.


2.4.4절. ºñµ¿±â ÀÔÃâ·Â ±¸Çö ¸ðµ¨

À§ÀÇ ¸î°¡Áö ¹®Á¦Á¡µé±îÁö ÇØ°áÇÑ ºñµ¿±â ÀÔÃâ·ÂÀ» »ç¿ëÇÏ´Â ³×Æ®¿÷ ¼­¹ö ÇÁ·Î±×·¥ÀÇ ÇÁ·Î¼¼½º´Â ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.

// ¾²·¹µå ÇÔ¼ö
// ½Ã±×³Î Çڵ鷯¿¡¼­ È£ÃâÇÑ ¾²·¹µå ÇÔ¼öÀÌ´Ù. 
void *thread_func()
{
    pthread_cond_wait ¸¦ ÀÌ¿ëÇØ¼­ ¾²·¹µå ½Ã±×³ÎÀ» ±â´Ù¸°´Ù.  
    ¾î´À ÆÄÀÏÁöÁ¤ÀÚ¿¡¼­ ÀÔ·ÂÀÌ ÀÖ¾ú´ÂÁö¸¦ °Ë»çÇÑ´Ù. 
    ¸¸¾à endpoint (socket ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¸¸µé¾îÁø) ¼ÒÄÏÀ̶ó¸é 
    {
        accept ÇÔ¼ö¸¦ È£ÃâÇØ¼­ Ŭ¶óÀÌ¾ðÆ®¸¦ À§ÇÑ µè±â ¼ÒÄÏÀ» ¸¸µéµµ·Ï ÇÑ´Ù. 
    }
    ¸¸¾à ÀÔ·ÂÀÌ ÀÖ´Â ÆÄÀÏÁöÁ¤ÀÚ°¡ µè±â ¼ÒÄÏÀ̶ó¸é
    {
        read¸¦ È£ÃâÇØ¼­ µ¥ÀÌŸ¸¦ ÀоîµéÀ̰í ÀûÀýÇÑ ÀÛ¾÷À» ÇÑ´Ù. 
    } 
    ¸¸¾à ¿¹¿Ü »óȲÀÌ ¹ß»ýÇß´Ù¸é 
    {
        ¿¹¿Ü»óȲÀ» ºÐ¼®Çؼ­, ÀûÀýÇÑ Çൿ(Á¾·áÇϵçÁö ÇϴµîÀÇ)À» 
        ÃëÇϵµ·Ï ÇÑ´Ù.  
    }
    ¼ÒÄÏÀ» ´Ý°í ¾²·¹µå¸¦ Á¾·áÇÑ´Ù. 
}

// sig_handle ´Â ½Ã±×³ÎÀÌ ¹ß»ýÇϸé È£ÃâÇÒ ½Ã±×³Î Çڵ鷯ÀÌ´Ù. 
void sig_handle()
{
    È£ÃâµÈ ½Ã±×³ÎÀ» Àá±Ù´Ù. 
    pthread_cond_signal À» ÀÌ¿ëÇØ¼­ ¾²·¹µå ½Ã±×³ÎÀ» ¹ß»ýÇÑ´Ù. 
    È£ÃâµÈ ½Ã±×³ÎÀÇ Àá±ÝÀ» ÇØÁ¦ÇÑ´Ù. 
}

int main()
{
    socket ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ endpoint ¼ÒÄÏÁöÁ¤ÀÚ¸¦ ¸¸µç´Ù. 
    socket -> bind -> listen À¸·Î ÇØ´ç ¼ÒÄÏÁöÁ¤ÀÚ¿¡ ´ëÇÑ Æ¯¼º ¼³Á¤ 

    fcntl À» ÀÌ¿ëÇÏ¿© endpoint ¼ÒÄÏÁöÁ¤ÀÚ¸¦ ºñµ¿±â¸ðµå·Î Àüȯ½ÃŲ´Ù.  

    signal Çڵ鷯¸¦ ÁöÁ¤ÇÑ´Ù. 
    signal Çڵ鷯ÀÇ À̸§Àº sig_handle ·Î ÇÑ´Ù.  

    
    thread_func ¾²·¹µå¸¦ ½ÇÇà½ÃŲ´Ù. 
    while(1)
    {
        ¾î¶² ÀÛ¾÷À» ÇÑ´Ù. 
    }
}
				
À§ÀÇ ¸ðµ¨Àº »ó´çÈ÷ ¹Ù»Û ÀÔÃâ·ÂÀÌ ÀÖÀ»°ÍÀ̶ó´Â °¡Á¤ÇÏ¿¡ ¸¸µé¾îÁø ¸ðµ¨ÀÌ´Ù. ¸¸¾à ±×¸® ¹Ù»Û ÀÔÃâ·Â »óȲÀÌ ¿¹»óµÇÁö ¾Ê´Â´Ù¸é ÇÊ¿ä ¾ø´Â ºÎºÐÀ» Á¦°ÅÇØ¼­ Á»´õ ´Ü¼øÈ­ ½Ãų¼ö ÀÖÀ»°ÍÀÌ´Ù - ¾Æ¸¶µµ ¸¹Àº °æ¿ì thread_func ´Â ÇÊ¿ä ¾øÀ»¼öµµ ÀÖ´Ù -.

Ư¼öÇÑ °æ¿ì°¡ ¾Æ´Ï¶ó¸é ³×Æ®¿÷¼­¹ö¸¦ ºñµ¿±âÀÔÃâ·Â ¸ðµå¸¦ ÀÌ¿ëÇØ¼­ ÀÛ¾÷ÇÏ´Â °æ¿ì´Â ÈçÇÏÁö ¾Ê´Ù. Ưº°È÷ select ³ª poll µî¿¡ ºñÇØ¼­ ƯÀÌÇÑ ÀÕÁ¡ÀÌ ¾øÀ¸¸ç, Á¦´ë·Î ±¸ÇöÇÏ·Á¸é ²Ï ±î´Ù·Ó±â ¶§¹®ÀÌ´Ù. ´ë±â¿­À» °¡ÁöÁö ¸øÇÏ´Â ½Ã±×³ÎÀÇ Æ¯Â¡µµ ¹«½Ã¸øÇÒ ¹®Á¦Á¡ÀÌ´Ù - ÀÌ ¹®Á¦´Â realtime signal À» ÀÌ¿ëÇØ¼­ ÇØ°áÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù -.

³×Æ®¿÷ ¼­¹ö¸¦ ºñµ¿±â ÀÔÃâ·Â¸ðµå·Î ¸¸µé°íÀÚ ÇÑ´Ù¸é, ¾Æ¸¶µµ realtime signal À» »ç¿ëÇØ¾ß ÇÒ°ÍÀÌ´Ù. ±×·³¿¡µµ ºñµ¿±â ÀÔÃâ·Â ±¸Çö¸ðµ¨À» ³×Æ®¿÷ ¼­¹ö¸¦ ÀÌ¿ëÇØ¼­ ¼³¸íÇÏ´Â °ÍÀº ºñµ¿±â ÀÔÃâ·Â¿¡ ´ëÇÑ ±âº»ÀûÀÎ ¸ðµç »çÇ×À» Æ÷ÇÔÇϸ鼭µµ ¸î°¡Áö »ý°¢ÇØ¾ßµÉ ¹®Á¦Á¡µéÀ» ¾Ë¾Æ³¾¼ö Àֱ⠶§¹®ÀÌ´Ù.


3절. ±¸Çö Å×½ºÆ®

³×Æ®¿÷ ¼­¹ö ±¸ÇöÀ» ÇÏÁö´Â ¾ÊÀ»°ÍÀÌ´Ù. ´ÜÁö ÀÌ·±½ÄÀ¸·Î ºñµ¿±âÀÔÃâ·Â ÇÁ·Î±×·¡¹ÖÀÌ °¡´ÉÇÏ´Ù´Â ±â¹ý Á¤µµ¿¡¼­ ¼³¸íÀ» ¸¶Ä¥°ÍÀÌ´Ù.

ÀÌÀ¯´Â (¾Õ¿¡¼­ ¼³¸íÇßµíÀÌ)±»ÀÌ ¼­¹ö ÇùÖÀ» Çϴµ¥ ºñµ¿±âÀÔÃâ·ÂÀ» »ç¿ëÇÒ Çʿ伺ÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. ÀÏ´Ü ¸®´ª½º »ó¿¡¼­ ºñµ¿±â ÀÔÃâ·ÂÀ» À§Çؼ­ »ç¿ëÇÏ´Â SIGIO ½ÅÈ£ÀÇ °æ¿ì ¾î¶² ÆÄÀÏÁöÁ¤ÀÚ·Î ºÎÅÍ ÀÔ·ÂÀÌ ÀÖ¾ú´ÂÁö¸¦ ¾Ë¼ö°¡ ¾ø´Ù. ±×·³À¸·Î select ¸¦ ¾²´øÁö, ºñºÀ¼â·Î ÆÄÀÏÀ» °Ë»çÇϵçÁö Çϴ¹æ¹ý À¸·Î ¸ðµç ÆÄÀÏÁöÁ¤ÀÚ¿¡ ´ëÇØ¼­ ¸ù¶¥ °Ë»ç¸¦ ÇØÁÖ¾î¾ß ÇÑ´Ù. ÀÌ·² ¹Ù¿¡´Â Â÷¶ó¸® óÀ½ºÎÅÍ select, poll À» »ç¿ëÇØµµ µÇ±â ¶§¹®ÀÌ´Ù.

±×·¸´Ù¸é ½ÇÁ¦·Î ºñµ¿±â ÀÔÃâ·ÂÀÌ À¯¿ëÇÏ°Ô ¾²Àϼö ÀÖ´Â °÷Àº »ç¿ëÀÚ¿Í »óÈ£´ëÈ­ÇÏ´Â ¾îÇø®ÄÉÀÌ¼Ç Á¦À۽à Thread ¸¦ »ç¿ëÇÏÁö ¾Ê±â¸¦ ¿øÇÒ¶§ - ¹é±×¶ó¿îµå·Î ÀÛ¾÷Çϸ鼭 »ç¿ëÀÚ ÀÔ·ÂÀ» ó¸®ÇÏ°í ½ÍÀ»¶§ - ¿Í µð¹ÙÀ̽º(±â±â) ·ÎºÎÅÍÀÇ ÀÔ/Ãâ·Â À» ó¸®ÇÒ¶§°¡ µÉ°ÍÀÌ´Ù. ¹°·Ð ½Å°æ½á¾ß µÉ°Ô ²Ï ÀÖ°í, È¿´ÉÀÌ Àǽɽº·´±ä ÇÏÁö¸¸ ³×Æ®¿÷ ¼­¹ö ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ¼öµµ ÀÖÀ»°ÍÀÌ´Ù. (°í¼º´É ¼­¹ö¾îÇø®ÄÉÀÌ¼Ç Á¦ÀÛÀ» À§Çؼ­ realtime signal À» ÀÌ¿ëÇÑ ºñµ¿±âÀÔÃâ·Â ¸ðµ¨À» °í·ÁÇÒ¼ö ÀÖ±â´Â ÇÏ´Ù)

¿©±â¿¡¼­´Â ¾î¶²½ÄÀ¸·Î ±¸Çö°¡´ÉÇÑÁö¿¡ ´ëÇÑ ÈùÆ®¸¸ ¾òÀ»¼ö ÀÖ´Â ÃÖ¼ÒÇÑÀÇ Äڵ带 Á¦°øÇϵµ·Ï ÇÑ´Ù.

¿¹Á¦: async_input.c

#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

#include <stdlib.h>
#include <stdio.h>

#define STDIN 0 

int sockfd;
int client_num;

void iohandler(int signo)
{
	sigset_t sigset, oldset;
	sigfillset(&sigset);	
	// »õ·Îµé¾î¿À´Â ¸ðµç ½Ã±×³Î¿¡ ´ëÇØ¼­ block ÇÑ´Ù. 
	if (sigprocmask(SIG_BLOCK, &sigset, &oldset) < 0)
	{
		printf("sigprocmask %d error\n", signo);
	}
	printf("INPUT CHECK\n");
	// ÀԷ¿¡ µû¶ó¼­ ´Ù¾çÇÑ ÀÛ¾÷À» ÇÑ´Ù. 
}

int main(int argc, char **argv)
{
	struct sigaction iosig; 
	int value;

	client_num = 0;

	iosig.sa_handler =iohandler;
	sigemptyset(&iosig.sa_mask);
	iosig.sa_flags = 0;

	if (sigaction(SIGIO, &iosig, 0) == -1)
	{
		perror("error ");
		exit(0);
	}

	// Ç¥ÁØÀԷ¿¡ ´ëÇØ¼­ ºñµ¿±â ¸ðµå·Î ÁöÁ¤ÇÑ´Ù. 
	value = fcntl(STDIN, F_GETFL, 0);
	value |= O_ASYNC;
	fcntl (STDIN, F_SETFL, value);

	// Ç¥ÁØÀԷ¿¡ ´ëÇØ¼­ SIGIO ½Ã±×³ÎÀÌ ¹ß»ýÇÒ°æ¿ì 
	// ÇöÀç ÇÁ·Î¼¼½º°¡ ½Ã±×³ÎÀ» ¹Þµµ·Ï ¼³Á¤ÇÑ´Ù. 
	fcntl (STDIN, F_SETOWN, getpid());

	
	while(1)
	{
		// ¹«¾ð°¡ ¹é±×¶ó¿îµå ÀÛ¾÷À» ÇÒ°ÍÀÌ´Ù. 
		sleep(1);	
	}
}
		


4절. °á·Ð

ÀÌ»ó ½Ã±×³ÎÀ» ÀÌ¿ëÇÑ ºñµ¿±â ÀÔÃâ·Â¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù. ºñµ¿±â ÀÔÃâ·ÂÀº »ç½Ç»ó ¾²Àϸ¸ÇѰ÷ÀÌ ±×·¸°Ô ¸¹Áö ¾Ê´Ù. ´Ù·ç±â°¡ ±î´Ù·Ó°í ´Ù¸¥ ºñ½ÁÇÑ µµ±¸µéÀ» ÀÌ¿ëÇØ¼­ ±¸ÇöÀÌ °¡´ÉÇϱ⠶§¹®ÀÌ´Ù.

ÇÏÁö¸¸ ¸î¸î ±â±â¿Í °ü·ÃµÈ ÇÁ·Î±×·¥µé ȤÀº °ú°Å¿¡ ¸¸µç ÇÁ·Î±×·¥µéÀº ½Ã±×³Î ºñµ¿±â ÀÔÃâ·Â ±â¹ýÀ» Àû¿ëÇÑ °Íµµ ÀÖÀ¸´Ï ¾Ë¾ÆµÎ¸é Æí¸®ÇÒ °ÍÀÌ´Ù.

±×·³¿¡µµ ºÒ±¸ÇÏ°í ½Ã±×³ÎÀº °ÅÀÇ ½Ç½Ã°£À¸·Î Àü´ÞµÇ¾î Áú¼ö Àִٴ Ư¼ºÀ¸·Î realtime OS/¾îÇø®ÄÉÀ̼ÇÀÇ ±¸Çö¿¡¼­ »ç¿ëµÇ¾î Áú¼öÀÖ´Ù. ¹°·Ð ÀϹÝÀûÀÎ signal Àº ¾ÈµÇ°í realtime signal À» ÀÌ¿ëÇÑ ºñµ¿±â ÀÔÃâ·ÂÀÇ ±¸ÇöÀÏÅ×Áö¸¸...


Cache Error
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.