¸®´ª½º ½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö 6Àå - Signal
ÃÑ ÆäÀÌÁö ¼ö : 3027

Àüü ÇÔ¼ö/¿ë¾î»çÀü
ÇöÀçÀ§Ä¡ : ¹Ì´Ï»çÀÌÆ®>½Ã½ºÅÛÇÁ·Î±×·¡¹Ö>¸®´ª½º ½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö>ch06_Signal

Contents

1 signalÀÇ ÀϹÝÀû Á¤ÀÇ
1.1 ½Ã±×³Î
1.2 ¸Þ½ÃÁö
2 ¿î¿µÃ¼Á¦¿¡¼­ÀÇ signal
3 shell¿¡¼­ signalÀÇ »ç¿ë
4 ½Ã±×³ÎÀ» ¹Þ¾ÒÀ» ¶§
5 ½Ã±×³ÎÀÇ ¹üÁÖ
6 ½Ã±×³Î ÇÁ·Î±×·¡¹Ö
6.1 kill ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ ½Ã±×³Î º¸³»±â
6.2 signal ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ ½Ã±×³Î catch
7 ½Ã±×³ÎÀÇ Æ¯Â¡
7.1 ´ë±â¿­À» °¡ÁöÁö ¾Ê´Â´Ù.
7.2 ºñ½Å·Ú¼º
8 signalÀÇ Á¦¾î
8.1 killÀ» ÀÌ¿ëÇÑ ½Ã±×³ÎÀÇ Àü¼Û
8.2 signal¸¦ ÀÌ¿ëÇÑ ºñµ¿±âÀû ½Ã±×³Î ó¸®
8.3 signalÀ» ÀÌ¿ëÇÑ µ¿±âÀû ½Ã±×³Î ó¸®
9 sigaction ÇÔ¼ö±º À» ÀÌ¿ëÇÑ ½Ã±×³Î °´Ã¼ÀÇ Ã³¸®
10 ¸¶Ä¡¸ç

1 signalÀÇ ÀϹÝÀû Á¤ÀÇ

Àǹ̸¦ Àü´ÞÇϱâ À§Çؼ­ »ç¿ëÇÏ´Â ÀϹÝÀûÀÎ ¹æ¹ýÀ¸·Î ½ÅÈ£¿Í ¸Þ½ÃÁö°¡ ÀÖ´Ù. ¸Þ½ÃÁö´Â ¾ð¾î±â¹ÝÀÇ Àü´Þ¹æ½ÄÀ̸ç, ¿©·¯Àǹ̸¦ ³»Æ÷Çϰí ÀÖ´Â ºñ±³Àû º¹ÀâÇÑ ÀǹÌÀü´Þ ¹æ½ÄÀÌ´Ù.

¹Ý¸é, ½ÅÈ£´Â ÇϳªÀÇ Àǹ̸¸À» ³»Æ÷ÇÑ´Ù. ÇØ¼®ÀÌ °£´ÜÇÏ°í ºü¸¥Àü´ÞÀÌ °¡´ÉÇÏ´Ù´Â ÀåÁ¡À» Áö³­´Ù. ¿¹¸¦µé¾î ±³Åë½ÅÈ£ Ç¥ÁöÆÇÀº °¢°¢ÀÌ ÇϳªÀÇ Àǹ̸¸À» °¡Áö¸ç, ´©±¸¿¡°Ô³ª µ¿ÀÏÇÏ°Ô ÇØ¼®ÀÌ µÈ´Ù.

ÀÌ»óÀº ÀÏ¹Ý »ýȰ¿¡¼­ÀÇ ½ÅÈ£¿Í ¸Þ½ÃÁöÀÇ Â÷ÀÌÁ¡À» ±â¼úÇѰǵ¥, ÄÄÇ»ÅÍ¿¡¼­ÀÇ ÀǹÌÀü´Þ¿¡µµ ±×´ë·Î Àû¿ëµÈ´Ù.

1.1 ½Ã±×³Î

½Ã±×³Î Áï ½ÅÈ£´Â "ÀǹÌ"¸¦ »ó´ë¹æ¿¡°Ô Àü´ÞÇϱâ À§Çؼ­ »ç¿ëÇÏ´Â ¼ÒÅë¹æ½Ä Áß Çϳª·Î, ¾Æ¸¶µµ ÀηùÀÇ °¡Àå¿À·¡µÈ ¼ÒÅë¹æ½Ä Áß ÇϳªÀÏ °ÍÀÌ´Ù. Çϱä signalÀº Àΰ£¸¸ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Â À¯ÀÏÇÑ °ÍÀº ¾Æ´Ï´Ù. ½Ã±×³ÎÀº ±× ÀÚü°¡ º¹ÇÕÀûÀ̰í Ãß»óÀûÀÎ ¾ð¾îÀÇ ¼º°Ýº¸´Ù´Â ±¸Ã¼ÀûÀÌ°í ´Ü¼øÇÑ, Áï 1:1·Î Àǹ̰¡ ¸ÅĪÀÌ µÇ´Â ´Ü¼øÇÑ ¼ÒÅëÀÇ ¹æ½ÄÀ̱⠶§¹®ÀÌ´Ù. ¿¹ÄÁµ¥, µ¿¹°µéµµ ¿ïÀ½¼Ò¸®³ª ¸öµ¿ÀÛ, È£¸£¸ó, ¹è¼³¹°µéÀ» ÀÌ¿ëÇØ¼­ ´Ù¸¥ µ¿¹°µé¿¡°Ô ½ÅÈ£¸¦ º¸³½´Ù.

signalÀÌ µ¿¹°µé°ú Àΰ£µé¿¡°Ô À־ÀÇ ÃÖ¼ÒÇÑÀÇ ÀÇ»ç¼ÒÅëÀ¸·Î ¿À·§µ¿¾È ¼±È£µÇ¾î¿Â ÀÌÀ¯´Â ±× »ç¿ë¹æ¹ýÀÇ °£´ÜÇÔ°ú ÀǹÌÀü´ÞÀÇ È¿À²¿¡ ÀÖÀ» °ÍÀÌ´Ù. ¾ð¾îÀÇ °æ¿ì¿¡´Â ¸Å¿ì °£´ÜÇÑ ¹®ÀåÀ̶ó°í ÇÏ´õ¶óµµ ´Ù¾çÇÑ ÇØ¼®ÀÌ ÀÖÀ» ¼ö ÀÖ°í, ¹®È­¿Í ȯ°æÀÌ ´Ù¸¦ °æ¿ì¿¡´Â ÀüÇô ´Ù¸¥ ÇØ¼®ÀÌ ÀÖÀ» ¼ö ÀÖÁö¸¸, Á¤º¸¿Í Àǹ̰¡ 1:1·Î ¸ÅĪµÇ´Â signalÀº ±× Àǹ̸¦ ÇØ¼®Çϴµ¥ ¸¹Àº ¿¡³ÊÁö¸¦ »ç¿ëÇÒ Çʿ䰡 ¾ø±â ¶§¹®ÀÌ´Ù. ºü¸£°í Àü´ÞµÇ°í ºü¸£°Ô ÇØ¼®µÈ´Ù´Â ÀåÁ¡À» °¡Áø´Ù°í º¼ ¼ö ÀÖ°Ú´Ù.

¹°·Ð signalµµ ´ÜÁ¡Àº ÀÖ´Ù. 1:1À̱⠶§¹®¿¡, »ýÁ¸¿¡ ÇÊ¿äÇÑ ÃÖ¼ÒÇÑÀÇ Á¤º¸¸¦ Á¤È®ÇÏ°Ô Àü´ÞÇϱ⿡´Â ¸Å¿ì È¿À²ÀûÀÌÁö¸¸, º¹ÀâÇÑ Àǹ̸¦ Àü´ÞÇÒ¶§¿¡´Â ¿ÀÈ÷·Á È¿À²ÀÌ ¶³¾îÁú ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù.

¿äÁò°ú °°ÀÌ º¹ÀâÇÑ ½Ã´ë¿¡, ½ÅÈ£¿Í °°Àº ´Ü¼øÇÑ °Íµé·Î´Â »ì¾Æ°¡±â°¡ ±ÍÂúÀ» °Í °°´Ù°í »ý°¢µÉÁöµµ ¸ð¸£Áö¸¸, »ç½Ç ½ÅÈ£´Â ¿ÀÈ÷·Á ´õ¿í´õ ³Î¸® »ç¿ëµÇ´Â Ãß¼¼´Ù. ±×·¸ÀݾƵµ º¹ÀâÇÑ ¼¼»óÀε¥, ¾î´À ¼¼¿ù¿¡ ±×°É ¸»°ú ±Û·Î ¼³¸íÇÏ°í ¾É¾Æ ÀÖÀ» °ÍÀΰ¡.

Áö±ÝÀº À§ÇèÇÏ¿À´Ï ±æÀ» °Ç³ÊÁö ¸¶½Ã¿ÀÇÏ´Â °Íº¸´Ù »¡°£ºÒÄÑÁÖ´Â°Ô Àǹ̸¦ ÈξÀ´õ Àß Àü´ÞÇÒ ¼ö ÀÖ´Ù. ½ÅÈ£´Â ¿ÀÈ÷·Á Â÷°í ³ÑÄ£´Ù. µµ·Î´Â ¿ÂÅë ½ÅÈ£µé·Î ³ÑÃijª¸ç, ÀÎÅÍ³Ý ¼¼°è¿ª½Ã À̸ðƼÄÜÀ¸·Î ´ëÇ¥µÇ´Â ½ÅÈ£µé·Î °¡µæ ä¿öÁ® ÀÖ´Ù.

ÀÌµé ½ÅÈ£´Â ÁÖ·Î ´ÙÀ½ÀÇ µÎ°¡Áö ¿ëµµ¿¡ ƯÈ÷ Àß »ç¿ëµÉ ¼ö ÀÖ´Ù.
  1. ºñµ¿±âÀûÀÎ »ç°ÇÀÌ ¹ß»ýÇßÀ½À» ¾Ë¸®±â À§ÇÔ : Áï ¿¹·Î µéÀÚ¸é ÀüÈ­º§, ¸Þ½ÃÁö°¡ µµÂøÇßÀ½À» ¾Ë¸®´Â ¾Ë¶÷
  2. »ç°ÇÀ» µ¿±âÈ­ Çϱâ À§ÇÔ : ½Ã°è¾Ë¶÷, ÀÚµ¿Â÷°æÁÖ¿¡¼­ Ãâ¹ß½Ã°¢À» ¸ÂÃß±â À§ÇÔ

1.2 ¸Þ½ÃÁö

½Ã±×³ÎÀº ºü¸£°í, °£´ÜÇÏ°Ô ÀÌÇØµÉ ¼ö ÀÖ´Ù´Â ÀåÁ¡ÀÌ ÀÖÁö¸¸ º¹ÀâÇÑ Á¤º¸¸¦ Àü´ÞÇÒ ¼ö ¾ø´Ù´Â ´ÜÁ¡À» °¡Áø´Ù. ±×·¡¼­ Àΰ£ÀÇ ¾ð¾î¿Í ºñ½ÁÇÑ ÇüÅ·Π¸Þ½ÃÁö¸¦ ÀÌ¿ëÇØ¼­ Á¤º¸¸¦ Àü´ÞÇÏ´Â ¹æ¹ýµµ ÀÖ´Ù.

ÀÌ ¹æ½ÄÀ» ÀÌ¿ëÇÏ¸é º¹ÀâÇÑ Á¤º¸¸¦ Àü´ÞÇÒ ¼ö ÀÖÁö¸¸, ¸Þ½ÃÁöÀÇ Çü½Ä°ú ÇØ¼®¹æ¹ý¿¡ ´ëÇØ¼­ ¼­·Î ¾à¼ÓÀÌ µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. ³ª´Â ³Ê¸¦ »ç¶ûÇÑ´Ù¶ó´Â Àΰ£ÀÇ ¸Þ½ÃÁö¸¦ ¿¹·Î µé¾îº¸ÀÚ. ÀÌ ¸Þ½ÃÁö¸¦ Á¤È®È÷ Àü´ÞÇϰí ÀÌÇØÇÒ·Á¸é ÁÖ¾î+µ¿»ç+¸ñÀû¾î¶ó´Â ¹®ÀåÀÇ Çü½Ä°ú ³ª, ³Ê, »ç¶û, ÇÏ´ÙÀÇ ´Ü¾îµéÀÇ Àǹ̸¦ ¾Ë°í ÀÖ¾î¾ß¸¸ ÇÑ´Ù. ¶ÇÇÑ ÀÌ·¯ÇÑ ¾à¼ÓÀ» ¾Ë°í ÀÖ´Ù°í ÇÏ´õ¶óµµ, ÀÚ½ÅÀÌ Ã³ÇÑ ¹®È­/»çȸÀû ȯ°æ°ú ±³À°¼öÁØ¿¡ µû¶ó¼­ ÀüÇô ´Ù¸£°Ô ÇØ¼®ÀÌ µÇ±âµµ ÇÑ´Ù.

ÀÌó·³ ÀÌ¿ëÇϱ⠺¹ÀâÇÏÁö¸¸ Çü½Ä°ú Àǹ̸¦ ÀÌÇØÇϰí ÀÖ´Ù¸é, ¸î°³ÀÇ ´Ü¾î¸¸À» °¡Áö°íµµ ¾öû³ª°Ô ´Ù¾çÇÑ Á¤º¸Àü´ÞÀÌ °¡´ÉÇÏ´Ù´Â ÀåÁ¡À» °¡Áø´Ù. ¿ì¸®°¡ ÀÏ»óÀûÀ¸·Î »ç¿ëÇÏ´Â ´Ü¾î´Â ¼öõ°³¿¡ ºÒ°úÇÏ´Ù. ±×·¸Áö¸¸ ÀÌ ¼öõ°³·Î °ÅÀÇ ¹«ÇÑ¿¡ °¡±î¿î Àǹ̸¦ Àü´ÞÇÒ ¼ö ÀÖ´Ù.

ÄÄÇ»ÅÍ¿¡¼­´Â ÇÁ·Î¼¼½º°£ º¹ÀâÇÑ Á¤º¸±³È¯À» À§Çؼ­ ¸Þ½ÃÁö¸¦ ±³È¯ÇÏ´Â °æ¿ì°¡ ¸¹´Ù. Àΰ£ÀÇ ¾ð¾î¿Í ¸¶Âù°¡Áö·Î À̵鵵 ÇØ¼®µÉ ¼ö ÀÖµµ·Ï ¸Þ½ÃÁö ±Ô¾àÀ» °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ ¸Þ½ÃÁö ±Ô¾àÀ» ProtocolÀ̶ó°í ÇÑ´Ù. ¿¹¸¦µé¾î Web Server´Â Web Client¿Í ¸Þ½ÃÁö Åë½ÅÀ» Çϴµ¥, À̶§ µû¸£´Â ProtocolÀÌ HTTP(HyperText Transfer Protocol)ÀÌ´Ù. ¸¶Âù°¡Áö·Î ÆÄÀÏÀü¼ÛÀ» À§ÇÑ ÀϹÝÀûÀÎ ÇÁ·ÎÅäÄÝ·Î FTP°¡ ÀÖ´Ù.

ÀÌµé ¸Þ½ÃÁö´Â ³»ºÎ ÇÁ·Î¼¼½º °£ÀÇ Åë½ÅÀÏ °æ¿ì IPC¶ó°í ÇÏ´Â ¸®´ª½º ¿î¿µÃ¼Á¦°¡ Á¦°øÇÏ´Â ³»ºÎÅë½Å¸ÞÄ¿´ÏÁò¿¡ µû¶ó¼­ Àü´ÞµÉ ¼ö ÀÖ´Ù. ¸Ö¸®¶³¾îÁø ÇÁ·Î¼¼½º, Áï ÀÎÅͳÝÀ¸·Î ¿¬°áµÈ ÇÁ·Î¼¼½ºµéÀ̶ó¸é TCP/IP(:12)¸¦ ÀÌ¿ëÇØ¼­ Åë½ÅÀÌ ÀÌ·ç¾îÁú °ÍÀÌ´Ù. TCP/IP´Â ÀÎÅͳݻ󿡼­ µ¥ÀÌÅ͸¦ Àü¼ÛÇϱâ À§ÇÑ ÇÁ·ÎÅäÄÝÀ̸ç, ¸®´ª½º´Â À̵é ÇÁ·ÎÅäÄÝÀ» ½±°Ô »ç¿ëÇÒ ¼ö ÀÖµµ·Ï socket¸¦ Á¦°øÇÑ´Ù.

IPC´Â µÞÀå¿¡¼­ µû·Î ´Ù·ê °ÍÀÌ´Ù. ³×Æ®¿öÅ©»ó¿¡¼­ socketÀ» ÀÌ¿ëÇÑ ÇÁ·Î¼¼½º°£ Åë½ÅÀº ÀÌ ¹®¼­ÀÇ ¹üÀ§¸¦ ¹þ¾î³­´Ù. ¾Æ¸¶µµ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö °ü·ÃµÈ º°µµÀÇ ¹®¼­¸¦ ÅëÇØ¼­ ´Ù·ç°Ô µÉ °ÍÀÌ´Ù.

2 ¿î¿µÃ¼Á¦¿¡¼­ÀÇ signal

¿î¿µÃ¼Á¦°¡ ÇÏ´Â °¡Àå Áß¿äÇÑ ÀÏÀº ÄÄÇ»ÅÍ¿Í Àΰ£ÀÌ ¼­·Î ¿øÇÒÈ÷ ¼ÒÅëÇÒ ¼ö ÀÖ°Ô²û µµ¿ÍÁÖ´Â ÀÏÀÌ µÉ°ÍÀÌ´Ù. ¿î¿µÃ¼Á¦¿Í Àΰ£ »çÀÌ¿¡´Â ´Ù½Ã ÀÀ¿ë ¼ÒÇÁÆ®¿þ¾î°¡ ³õ¿©ÀÖ°í, Àΰ£Àº ÀÀ¿ë ¼ÒÇÁÆ®¿þ¾î¸¦ ÅëÇØ¼­ ¿î¿µÃ¼Á¦¿Í ¼ÒÅëÀ» ÇÏ°Ô µÈ´Ù.
  +----------+     |    | 
  | Computer |<--->| OS | <-------> ÀÀ¿ë APP    <---------> »ç¿ëÀÚ 
  |          |     |    | <-------> ÀÀ¿ë APP 
  |          |     |    | <-------> ÀÀ¿ë APP 
  +----------+     |    | 
 

¿î¿µÃ¼Á¦´Â À̵é ÀÀ¿ë ¼ÒÇÁÆ®¿þ¾î°£ ±×¸®°í ÀÀ¿ë ¼ÒÇÁÆ®¿þ¾î¿Í »ç¿ëÀÚ°£ÀÇ ¼ÒÅëÀ» À§ÇÑ ¸î°¡Áö µµ±¸µéÀ» Á¦°øÇÑ´Ù. ¿¹ÄÁµ¥, IPC(´ÙÀ½ Àå¿¡¼­ ´Ù·ç°ÔµÉ)¿Í °°Àº °ÍµéÀε¥, À̰ÍÀº Àΰ£ÀÇ ¾ð¾îÀÇ ÇüÅ¿¡ °¡±õ´Ù. Áï ´Ù¾çÇÑ ÇüÅÂ·Î ÇØ¼®µÉ ¼ö ÀÖ´Â ¸Þ½ÃÁöµéÀ» ÁÖ°í ¹ÞÀ½À¸·Î½á, °¢°¢ÀÇ °´Ã¼µé°£ÀÇ ¼ÒÅëÀ» Áö¿øÇÑ´Ù.

À̵éÀº ÀçÇØ¼®°¡´ÉÇÑ µ¥ÀÌÅ͸¦ ÀÌ¿ëÇϱ⠶§¹®¿¡, °´Ã¼°£ º¹ÀâÇÑ ¼ÒÅëÀ» ÇÒ ¼ö ÀÖÁö¸¸, ¹Ý´ë·Î »ç¿ëÇϱ⿡ ³Ê¹« º¹ÀâÇÑ ¸éÀÌ ÀÖ´Ù. ¶§·Î´Â Àΰ£À̳ª ȤÀº µ¿¹°µéÀÌ ±×·¸µíÀÌ, ¾ÆÁÖ °£´ÜÇÏ°Ô ¼ÒÅëÇÒ ¼ö ÀÖ´Â signal°°Àº µµ±¸µµ ÇÊ¿äÇÒ °ÍÀÌ´Ù.

±×·¡¼­ ´ëºÎºÐÀÇ ¿î¿µÃ¼Á¦´Â signalÀ» Áö¿øÇϸç, ¸¶Âù°¡Áö·Î Linuxµµ signalÀ» Áö¿øÇÑ´Ù. ½Ã±×³ÎÀº Àΰ£À̳ª µ¿¹°ÀÌ »ç¿ëÇÏ´Â ±×°Í°ú ¸Å¿ì À¯»çÇÏ´Ù. Áï ÀÇ¹Ì¿Í Á¤º¸°¡ 1:1·Î ¸ÅĪµÇ±â ¶§¹®¿¡, ÀçÇØ¼®ÇÒ ÇÊ¿ä¾øÀÌ Áï½Ã Àǹ̸¦ ¾Ë¾Æ³¾ ¼ö ÀÖµµ·Ï µÇ¾î ÀÖ´Ù.

¸®´ª½º ¿î¿µÃ¼Á¦´Â ¹Ì¸® ¾à¼ÓµÇ¾î ÀÖ´Â ¼ö½Ê°¡ÁöÀÇ signalÀ» Á¦°øÇϴµ¥, kill(1)À» ÀÌ¿ëÇÏ¸é ¸®´ª½º°¡ Áö¿øÇÏ´Â signalÀÇ Á¾·ù¸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù.
# kill -l  
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL 
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE 
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2 
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT 
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP 
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU 
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH 
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN 
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4 
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8 
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6 
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2 
63) SIGRTMAX-1  64) SIGRTMAX 
 
¿©±â¿¡¼­ ½Ã±×³ÎÀÇ À̸§°ú ±× ½Ã±×³ÎÀÇ °íÀ¯¹øÈ£¸¦ ¾Ë ¼ö ÀÖ´Ù.

»ó´çÈ÷ ¸¹Àº ½Ã±×³ÎÀÌ Àִµ¥, ÀÚÁÖ»ç¿ëµÇ´Â °ÍµéÀ» Á¤¸®ÇØ º¸ÀÚ¸é ´ÙÀ½°ú °°´Ù. °¢°¢ÀÇ ½Ã±×³ÎÀº °íÀ¯ÇÑ ´ÜÀÏÀÇ Àǹ̸¦ °¡Áö°í ÀÖÀ½À» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.
SIGKILL ÇÁ·Î¼¼½º¸¦ Á׿©¶ó
SIGALARM ¾Ë¶÷À» ¹ß»ýÇÑ´Ù
SIGSTP ÇÁ·Î¼¼½º¸¦ ¸ØÃç¶ó
SIGCONT ¸ØÃçÁø ÇÁ·Î¼¼½º¸¦ ¿òÁ÷ÀÌ°Ô Ç϶ó
SIGINT ÇÁ·Î¼¼½º¿¡ ÀÎÅÍ·´Æ®Ç϶ó. Áï Â÷´ÜÇ϶ó
SIGSEGV ÇÁ·Î¼¼½º°¡ ´Ù¸¥ ¸Þ¸ð¸®¿µ¿ªÀ» ħ¹üÇß´Ù.
ÀÌµé ½Ã±×³ÎÀÇ »ç¿ë¿ëµµ´Â ºñµ¿±âÀûÀÎ »ç°ÇÀ» Àü´ÞÇϴµ¥, ƯÈ÷ À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Â ¼ÒÅëÀÇ µµ±¸´Ù. Áï ÇÁ·Î¼¼½º¸¦ Á×ÀÌ´Â °ÍÀº ±× ½Ã°£À» ¾Ë ¼ö ¾ø´Â ºñµ¿±âÀûÀÎ »ç°ÇÀÌ´Ù. ÇÁ·Î¼¼½º°¡ ´Ù¸¥ ¸Þ¸ð¸®¿µ¿ªÀ» ħ¹üÇÑ °Í ¿ª½Ã, ±× ¹ß»ý½Ã°£À» ¾Ë ¼ö°¡ ¾ø´Â ºñµ¿±âÀûÀÎ »ç°ÇÀÓÀ» ¾Ë ¼ö ÀÖ´Ù.

ÀÌµé ½Ã±×³ÎÀº ÀÏ»ó»ýȰ¿¡¼­ »ç¿ëÇÏ´Â ½Ã±×³Î°ú ¸¶Âù°¡Áö·Î ºñµ¿±âÀûÀÎ »ç°ÇÀÇ ¹ß»ýÀ» ÅëÁöÇϱâ À§ÇÑ ¿ëµµ¿Í »ç°ÇÀ» µ¿±âÈ­ ½Ã۱â À§Çѿ뵵·Î Å©°Ô ³ª´­ ¼ö ÀÖ´Ù. À§ÀÇ °æ¿ì¸¦ ¿¹·Î µé¾î¼­ ¼³¸íÇØ º¸ÀÚ¸é, SIGALARMÀº »ç°ÇÀ» µ¿±âÈ­ ½Ã۱â À§Çؼ­, SIGKILL, SIGSEGV´Â ºñµ¿±âÀûÀÎ »ç°ÇÀ» ÅëÁöÇϱâ À§Çؼ­ »ç¿ëÀ» ÇÑ´Ù.

3 shell¿¡¼­ signalÀÇ »ç¿ë

shell ÇÁ·Î±×·¥À» ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ signalÀ» Àü´ÞÇÒ ¼ö ÀÖ´Â kill(1)À̶ó´Â ÇÁ·Î±×·¥À» Á¦°øÇÑ´Ù. »ç¿ë¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.
kill -signal pid 
 
¿¹¸¦µé¾î pid°¡ 100ÀÎ ÇÁ·Î¼¼½º¸¦ Á×ÀÌ°í ½Í´Ù¸é, ¾Æ·¡¿Í °°ÀÌ killÀ» »ç¿ëÇÏ¸é µÈ´Ù.
# kill -SIGKILL 100 
 
ȤÀº ½Ã±×³Î À̸§´ë½Å¿¡ ½Ã±×³ÎÀÇ °íÀ¯¹øÈ£¸¦ »ç¿ëÇÏ´Â ¹æ¹ýµµ ÀÖ´Ù.
#kill -9 100 
 
ÀÌÁ¦ 100¹ø ÇÁ·Î¼¼½º·Î SIGKILL ½Ã±×³ÎÀÌ Àü´ÞµÇ°í, ÇØ´ç ÇÁ·Î¼¼½º´Â °­Á¦·Î Á¾·á°¡ µÉ °ÍÀÌ´Ù. ¹°·Ð, ±×·¸´Ù°í ÇØ¼­ ¾Æ¹« ÇÁ·Î¼¼½º³ª ¸¶±¸ ½Ã±×³ÎÀ» º¸³¾ ¼ö ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù. ÀڱⰡ ±ÇÇÑÀ» °¡Áö°í ÀÖ´Â ÇÁ·Î¼¼½º¿¡ ´ëÇØ¼­¸¸ ½Ã±×³ÎÀ» º¸³¾ ¼ö ÀÖ´Ù. ¾Æ¹« ÇÁ·Î¼¼½º¿¡ °ü°è¾øÀÌ ½Ã±×³ÎÀ» º¸³»±â À§Çؼ­´Â root ±ÇÇÑÀ» °¡Á®¾ß¸¸ ÇÑ´Ù.

¶ÇÇÑ Å°º¸µå ÀÔ·ÂÀ¸·Î ½Ã±×³ÎÀ» ¹ß»ý½Ãų ¼öµµ ÀÖ´Ù. °¡Àå ´ëÇ¥ÀûÀΰÔ, ÇÁ·Î±×·¥À» Á¾·á½Ã۱â À§Çؼ­ Ctrl+C ÀÔ·ÂÇÏ´Â °ÍÀ¸·Î, ÀÌ Å°¸¦ ÀÔ·ÂÇϸé ÇØ´ç ÇÁ·Î¼¼½º¿¡ SIGINT°¡ Àü´ÞÀÌ µÇ¾î¼­ ÇÁ·Î¼¼½º°¡ Á¾·á°¡ µÈ´Ù. ¾Õ¿¡¼­ SIGINT´Â ÇÁ·Î¼¼½ºÀÇ Áß´ÜÀ̶ó°í Çߴµ¥, ¿Ö Á¾·á°¡ µÇ´Â°ÇÁö°¡ Àǹ®Á¡À¸·Î ³²À» °ÍÀÌ´Ù. ÀÌ¿¡ ´ëÇØ¼­´Â ´ÙÀ½Àý¿¡¼­ ¼³¸íÇϵµ·Ï ÇÒ °ÍÀÌ´Ù. Ctrl+C¸¦ ÀÔ·ÂÇßÀ» ¶§, ÇÁ·Î±×·¥ÀÌ Á¾·áµÇ´Â°Ç ¾î·ÆÁö ¾Ê°Ô È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¾Æ·¡ÀÇ ÇÁ·Î±×·¥À¸·Î È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ. ÇÁ·Î±×·¥À̸§Àº sigtest.c ·Î ÇϰڴÙ.
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
 
int main(int argc, char **argv) 
{ 
  int i = 0; 
  while(1) 
  { 
    printf("%d\n", i); 
    i++; 
  } 
} 
 

Űº¸µå ÀÔ·ÂÀ¸·Î ¹ß»ý½Ãų ¼ö ÀÖ´Â ½Ã±×³ÎÀº Ctrl+C ¿Ü¿¡µµ ¾Æ·¡ÀÇ ¸î°¡Áö°¡ ÀÖ´Ù.
Ctrl+C SIGINT ÇÁ·Î¼¼½º¸¦ Á¾·á½ÃŲ´Ù.
Ctrl+Z SIGSTP ÇÁ·Î¼¼½º¸¦ ÁߴܽÃŲ´Ù.
Ctrl+\ SIGQUIT core dump¸¦ ³²±â°í ÇÁ·Î¼¼½º¸¦ Á¾·á½ÃŲ´Ù.


4 ½Ã±×³ÎÀ» ¹Þ¾ÒÀ» ¶§

½Ã±×³ÎÀº °íÀ¯ÀÇ Àǹ̸¦ ³»Æ÷Çϰí ÀÖ´Ù. ÀÌ·¯ÇÑ ½Ã±×³ÎÀ» ¹ÞÀº ½ÇÇఴüÀÎ ÇÁ·Î¼¼½º´Â ±×¿¡ ¸Â´Â ÇൿÀ» ÇØ¾ß ÇÑ´Ù. ½Ã±×³ÎÀ» ¹ÞÀº ÇÁ·Î¼¼½º´Â ´ÙÀ½Áß ÇѰ¡Áö ÇൿÀ» ÃëÇØ¾ß ÇÑ´Ù.
  1. ±× ½Ã±×³ÎÀ» ó¸®ÇÒ µî·ÏµÈ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
  2. ½Ã±×³ÎÀ» ¹«½ÃÇÑ´Ù.
  3. ½Ã±×³ÎÀ» ¹«½ÃÇÏÁö ¾ÊÁö¸¸, ±×·¸´Ù°í ÇØ¼­ Ưº°È÷ ÇÔ¼ö¸¦ È£ÃâÇÏÁöµµ ¾Ê´Â´Ù.
ÀüÈ­º§ÀÌ ¿ï¸®¸é ÀüÈ­¸¦ ¹Þ°Å³ª ¹«½ÃÇϰųª ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. °¢°¢ 1, 2¹ø¿¡ ÇØ´çÇÑ´Ù.

¸¸¾à ½Ã±×³ÎÀ» ¹«½ÃÇÏÁöµµ ¾Ê°í, È£ÃâÇÒ ÇÔ¼öµµ µî·ÏÇÏÁö ¾Ê¾Ò´Ù¸é ½Ã±×³Î¿¡ ´ëÇÑ ±âº»ÇൿÀ» ÃëÇÏ°Ô µÈ´Ù. ÀÌ ±âº»Çൿ¿¡´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ ÀÖ´Ù.
  1. ÇÁ·Î¼¼½º°¡ Á״´Ù. ´ëºÎºÐÀÇ ½Ã±×³Î¿¡ ´ëÇÑ ±âº»Çൿ
  2. ÇÁ·Î¼¼½º°¡ ÁߴܵȴÙ.
  3. ¾Æ¹«ÀÏ ¾øÀÌ Áö³ª°£´Ù. - ¹«½ÃµÈ´Ù.
¿¹¸¦µé¾î CTRL+C À» ÀÔ·ÂÇϸé, SIGINT ½ÅÈ£°¡ ¹ß»ýµÇ´Âµ¥, ½Ã±×³Î¿¡ ´ëÇÑ ÇൿÀ» Á¤ÇÏÁö ¾Ê¾Ò´Ù¸é, ±âº»ÇൿÀÎ ÇÁ·Î¼¼½º Á¾·á¸¦ ÃëÇÏ°Ô µÈ´Ù.

½Ã±×³Î¿¡ ´ëÇØ¼­, È£ÃâµÉ ÇÔ¼ö¸¦ µî·ÏÇϰdzª ȤÀº ¹«½ÃÇÏ°Ô ¸¸µå´Â °ÍÀº µÚ¿¡ µû·Î ´Ù·çµµ·Ï ÇϰڴÙ.

5 ½Ã±×³ÎÀÇ ¹üÁÖ

½Ã±×³ÎÀº Á¦¾î°¡´ÉÇÑ ½Ã±×³Î°ú ±×·¸Áö ¸øÇÑ ½Ã±×³ÎÀÌ ÀÖ´Ù. ¿©±â¿¡¼­ Á¦¾î´Â ½Ã±×³ÎÀ» catchÇÏ´Â °Í¿¡¼­ ºÎÅÍ ½ÃÀ۵ȴÙ. catchÇÏÁö ¸øÇÑ´Ù¸é (´ç¿¬È÷)Á¦¾îÇÒ ¼öµµ ¾ø´Ù.

´ëºÎºÐÀÇ ½Ã±×³ÎÀº catch°¡ °¡´ÉÇϸç, ¹«½ÃÇϰųª, ±âº»ÇൿÀ» ÇÏ°Ô Çϰųª, º°µµÀÇ ÇÔ¼ö¸¦ ½ÇÇà½Ãų ¼ö ÀÖ´Ù. ±×·¯³ª catch ºÒ°¡´ÉÇÑ ÇÔ¼ö°¡ Àִµ¥, SIGKILL°ú °°Àº ÇÔ¼ö°¡ ´ëÇ¥ÀûÀÌ´Ù.

SIGKILLÀº ÇÁ·Î¼¼½º¸¦ ¹«Á¶°Ç Á×À̱â À§Çؼ­ »ç¿ëÇϴµ¥, ¿¹ÄÁµ¥ ¿Àµ¿ÀÛÇϸ鼭 CPUÀÚ¿øÀ» ¹«ÇÑ´ë·Î ¼ÒºñÇÏ´Â ÇÁ·Î¼¼½º¶ó¸é °­Á¦·Î Á¾·á½ÃÄÑ¾ß ÇÒ °ÍÀÌ´Ù. ±×·±µ¥, ½Ã±×³ÎÀÌ catch µÇ¾î¼­ ½Ã±×³ÎÀ» ¹«½ÃÇÏ°Ô ÇØ¹ö¸°´Ù¸é, ½Ã½ºÅÛ °ü¸®Àڷμ­´Â »ó´çÈ÷ ³­°¨ÇÒ °ÍÀÌ´Ù. ±×·¯¹Ç·Î ÀÌ ÇÁ·Î¼¼½º´Â catchÇÏÁö ¸øÇϵµ·Ï Çϰí ÀÖ´Ù.

SIGSTOPµµ ¸¶Âù°¡Áö·Î catchÇÒ ¼ö ¾ø´Ù. SIGSTOP¸¦ ¹ÞÀº ÇÁ·Î¼¼½º´Â Áï½Ã ÁߴܵǾî¾ß Çϸç, ¹«½ÃÇÒ ¼ö ¾ø´Ù. ¿ª½Ã ½Ã½ºÅÛ °ü¸®¸¦ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

6 ½Ã±×³Î ÇÁ·Î±×·¡¹Ö

½Ã±×³ÎÀÌ Àü´ÞµÇ¸é, ÇÁ·Î¼¼½º´Â ¹«½ÃÇÏ´øÁö, ÁöÁ¤µÈ ÇÔ¼ö¸¦ È£ÃâÇϵçÁö ÇØ¾ß ÇÑ´Ù. ±×·¸Áö ¾Ê´Ù¸é ±âº»ÇൿÀ» ÃëÇÏ°Ô µÈ´Ù. ¿©±â¿¡¼­´Â ½Ã±×³ÎÀ» Á¦¾îÇÏ´Â ¹æ¹ý Áï, ½Ã±×³ÎÀ» ¹«½ÃÇϰųª È£ÃâµÈ ÇÔ¼ö¸¦ ÁöÁ¤ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇÒ °ÍÀÌ´Ù.

6.1 kill ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ ½Ã±×³Î º¸³»±â

killÀº ÇÁ·Î¼¼½º¿¡ ½Ã±×³ÎÀ» Àü´ÞÇϱâ À§Çؼ­ »ç¿ëÇÒ ¼ö ÀÖ´Â °¡Àå°£´ÜÇÑ ÇÔ¼ö·Î, ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.
#include <sys/types.h> 
#include <signal.h> 
 
int kill(pid_t pid, int sig); 
 
  • pid : ÇÁ·Î¼¼½ºÀÇ PID
  • sig : ½Ã±×³Î ¹øÈ£

¿¬½À»ï¾Æ¼­ ÇÁ·Î¼¼½º¿¡ ¿øÇÏ´Â ½Ã±×³ÎÀ» º¸³»´Â °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ.
#include <sys/types.h> 
#include <signal.h> 
#include <stdlib.h> 
#include <stdio.h> 
 
int main(int argc, char **argv) 
{ 
    int pid; 
    int sig_num; 
 
    if (argc != 3) 
    { 
        printf("usage %s [pid] [signum]\n", argv[0]); 
        return 1; 
    } 
    // ½ÇÇàÀÎÀÚ·Î pid ¹øÈ£¿Í  
    // Àü¼ÛÇÒ signal ¹øÈ£¸¦ ¹Þ¾Æµé¿©¼­  
    // À̸¦ ÇØ´ç pid ·Î º¸³½´Ù.  
    pid = atoi(argv[1]); 
    sig_num = atoi(argv[2]); 
    if(!kill(pid, sig_num)) 
    { 
        perror("Signal Send error"); 
        return 1; 
    } 
    return 0; 
} 
 
´ÙÀ½Àº ½ÇÇà °á°ú´Ù.
$ ./signal 6653 2 
Signal Send error: Success 
 

6.2 signal ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ ½Ã±×³Î catch

killÀº ´Ù¸¥ ÇÁ·Î¼¼½º¿¡°Ô ½Ã±×³ÎÀ» º¸³»±â¸¸ ÇÒ»Ó, Àڽſ¡°Ô Àü´ÞµÇ´Â ½Ã±×³ÎÀ» catch ÇØ¼­ ó¸®ÇÒ ¼ö´Â ¾ø´Ù. ¸®´ª½º´Â signal ÇÔ¼ö¸¦ Á¦°øÇÏ´Â µ¥, À̸¦ ÀÌ¿ëÇØ¼­ Àڽſ¡°Ô Àü´ÞµÇ´Â ½Ã±×³ÎÀ» ó¸®ÇÒ ¼ö ÀÖ´Ù.

signal ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.
#include <signal.h> 
 
typedef void (*sighandler_t)(int); 
 
sighandler_t signal(int signum, sighandler_t handler); 
 
  1. signum : Á¦¾îÇÒ ½Ã±×³Î ¹øÈ£
  2. sighandler_t : signumÀ» ¹Þ¾ÒÀ» ¶§, È£ÃâÇÒ ÇÔ¼ö

´ÙÀ½Àº °£´ÜÇÑ ¿¹Á¦´Ù. ÇÁ·Î±×·¥À̸§Àº sigint.c·Î ÇÏÀÚ.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <signal.h> 
#include <unistd.h> 
#include <stdio.h> 
 
void sig_handler(int signo); 
 
int main(int argc, char **argv) 
{ 
  int i = 0; 
  signal(SIGINT, (void *)sig_handler); 
  while(1) 
  { 
    printf("%d\n", i); 
    sleep(2); 
    i++; 
  } 
} 
 
void sig_handler(int signo) 
{ 
  printf("I Received SIGINT(%d)\n", SIGINT); 
} 
 
CTRL+C ¸¦ ÀÔ·ÂÇÏ°Ô µÇ¸é, ÇöÀç ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½º¿¡ SIGINT°¡ Àü´ÞÀÌ µÈ´Ù. SIGINT¿¡ ´ëÇÑ ÇÁ·Î¼¼½ºÀÇ ±âº»ÇൿÀº Á¾·áÀ̱⠶§¹®¿¡, Ưº°È÷ ½Ã±×³ÎÀ» Á¦¾îÇÏÁö ¾ÊÀ» °æ¿ì ÇÁ·Î±×·¥Àº Á¾·á°¡ µÈ´Ù. ±×·¯³ª À§¿¡¼­´Â signalÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ SIGINT¿¡ ´ëÇØ¼­ sig_handler¶ó´Â ÇÔ¼ö¸¦ ½ÇÇàÇϵµ·Ï Çß´Ù. ÀÌÁ¦ CTRL+C¸¦ ÀÔ·ÂÇÏ°Ô µÇ¸é, ÇÁ·Î¼¼½º°¡ Á¾·áµÇ´Â ´ë½Å sig_handler¸¦ ½ÇÇàÇÏ´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

À§ ¿¹¿¡¼­´Â ½Ã±×³ÎÇÔ¼ö¸¦ ½ÇÇà½Ã۵µ·Ï Çϰí Àִµ¥, ½Ã±×³ÎÀ» ¹«½ÃÇϰųª ½Ã±×³ÎÀÇ ±âº»ÇൿÀ¸·Î µÇµ¹¾Æ°¡µµ·Ï ÇÒ ¼öµµ ÀÖ´Ù. À̰æ¿ì sig_handler ´ë½Å¿¡ SIG_IGN°ú SIG_DFLÀ» ÀÌ¿ëÇÏ¸é µÈ´Ù.
  • SIG_IGN : ½Ã±×³ÎÀ» ¹«½ÃÇÑ´Ù.
  • SIG_DFL : ±âº»ÇൿÀ» Çϵµ·Ï ÇÑ´Ù.
À§ÄÚµåÀÇ 10¹øÂ° ÁÙÀ» ´ÙÀ½°ú °°ÀÌ ¹Ù²Ù°í Å×½ºÆ®Çغ¸ÀÚ.
signal(SIGINT, SIG_IGN); 
 
CTRL+C ۰¡ ¾Æ¿¹¸ÔÁö ¾Ê´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

±×·¸´Ù¸é SIG_DFLÀº ¾ðÁ¦ »ç¿ëµÇ´Â°¡ ? º°µµÀÇ ½Ã±×³ÎÁ¦¾î ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é, ½Ã±×³Î¿¡ ´ëÇØ¼­ ±âº»ÇൿÀ» Çϵµ·Ï µÇ¾î Àִµ¥, »ç¿ëÇÒ Çʿ䰡 Àִ°¡ ÇÏ´Â Àǹ®ÀÌ »ý±æ ¼ö ÀÖÀ» °ÍÀÌ´Ù. SIG_DFLÀº ´ÙÀ½ÀÇ µÎ°¡Áö ¿ëµµ·Î ÁÖ·Î »ç¿ëµÈ´Ù.
  • ÃÖÃÊ ½Ã±×³ÎÀ» ¹«½ÃÇߴµ¥, Áß°£¿¡ ½Ã±×³ÎÀ» ±âº»ÇൿÀ¸·Î ÇØ¾ßÇÒ Çʿ䰡 ÀÖÀ» ¶§.
  • ÀÚ½ÄÇÁ·Î¼¼½º¸¦ »ý¼ºÇßÀ»¶§.
    fork(2)¸¦ ÀÌ¿ëÇØ¼­ ÀÚ½ÄÇÁ·Î¼¼½º¸¦ »ý¼ºÇϸé, ÀÚ½ÄÇÁ·Î¼¼½º´Â ºÎ¸ðÀÇ ½Ã±×³ÎÁ¤Ã¥±îÁö¸¦ ±×´ë·Î º¹»çÇØ¼­ »ç¿ëÇÏ°Ô µÈ´Ù. Áï ºÎ¸ðÀÇ Æ¯Á¤ ½Ã±×³Î¿¡ Á¤Ã¥ÀÌ SIG_IGN ÀÌ¿´´Ù¸é, Àڽĵµ ±×´ë·Î ±× Á¤Ã¥À» µû¸¥´Ù. ¶§·Î, ÀÚ½ÄÀÇ ½Ã±×³Î Á¤Ã¥À» ´Þ¸®ÇÒ Çʿ䰡 ÀÖÀ» °ÍÀÌ´Ù. ÀÌ °æ¿ì »ç¿ëÇÒ ¼ö ÀÖ´Ù.

7 ½Ã±×³ÎÀÇ Æ¯Â¡

Áö±Ý±îÁö ÇØ¼­, ½Ã±×³ÎÀÇ °£´ÜÇÑ Æ¯Â¡°ú ½Ã±×³ÎÀ» Àü¼ÛÇÏ°í ¹Þ´Â °Í¿¡ ´ëÇÑ ±âº»ÀûÀÎ Á¤º¸¸¦ ¾ò°Ô µÇ¾ú´Ù. ÀÌÁ¦ º»°ÝÀûÀ¸·Î ½Ã±×³ÎÀÇ Á¦¾î¿Í °ü·ÃµÈ ¾ê±â¸¦ ÇØ¾ß ÇҰǵ¥, ±× Àü¿¡ ½Ã±×³ÎÀÇ ¼¼ºÎÀûÀΠƯ¡¿¡ ´ëÇØ¼­ ¾ð±ÞÇÏ°í ³Ñ¾î°¡¾ß ÇÒ°Í °°´Ù.

´ë»óÀÌ ¹«¾ùÀ̵çÁö °£¿¡, ´ë»óÀ» Á¦´ë·Î Á¦¾îÇϱâ À§Çؼ­´Â ´ë»óÀÇ Æ¯Â¡À» ¿ì¼±¾Ë°í ÀÖ¾î¾ß ÇÒ °ÍÀ̱⠶§¹®ÀÌ´Ù.

7.1 ´ë±â¿­À» °¡ÁöÁö ¾Ê´Â´Ù.

½Ã±×³ÎÀÇ Ã¹¹øÂ° Ư¡Àº ´ë±â¿­À» °¡ÁöÁö ¾Ê´Â ´Ù´Â Á¡ÀÌ´Ù. À̰ÍÀº ¹¹³Ä¸é, ÇÁ·Î¼¼½º´Â µ¿½Ã¿¡ ÇϳªÀÇ ½Ã±×³Î¸¸ ó¸®ÇÒ ¼ö ÀÖ´Ù´Â ¾ê±â°¡ µÈ´Ù. ¿¹¸¦µé¾î¼­ SIGINT ½Ã±×³ÎÀ» ¹Þ¾Æ¼­, ÀÌ¿¡ ´ëÇÑ Ã³¸®¸¦ Çϰí ÀÖ´ÂÁß¿¡, ´Ù½Ã SIGINT°¡ ¹ß»ýÇÏ°Ô µÈ´Ù¸é, ÀÌ ½Ã±×³ÎÀº ÀÒ¾î¹ö¸®°Ô µÈ´Ù.

´ÙÀ½Àº ´ë±â¿­À» °¡ÁöÁö ¾Ê´Â ½Ã±×³ÎÀÇ Æ¯Â¡À» Å×½ºÆ®Çϱâ À§ÇÑ °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù.

À§ÀÇ sigint.c¿¡ ÇÑÁÙÃß°¡ÇßÀ» »ÓÀÌ´Ù.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <signal.h> 
#include <unistd.h> 
#include <stdio.h> 
 
void sig_handler(int signo); 
 
int main(int argc, char **argv) 
{ 
  int i = 0; 
  signal(SIGINT, (void *)sig_handler); 
  while(1) 
  { 
    printf("%d\n", i); 
    sleep(2); 
    i++; 
  } 
} 
 
void sig_handler(int signo) 
{ 
  printf("I Received SIGINT(%d)\n", SIGINT); 
  sleep(4); 
} 
 
23¶óÀο¡ sleep()ÇÔ¼ö°¡ Ãß°¡µÇ¾ú´Ù. ÀÌÁ¦ ÇÁ·Î±×·¥À» ½ÇÇà½Ã۰í, CTRL+C¸¦ ÀÔ·ÂÇϸé SIGINT°¡ Àü´ÞµÉ °ÍÀ̰í, ÇÁ·Î¼¼½º´Â sig_handlerÀ» ½ÇÇà½Ãų °ÍÀÌ´Ù. sig_handler´Â 4Ãʸ¦ ±â´Ù¸®´Âµ¥, À̶§ CTRL+C¸¦ ´Ù´Ù´Ú ´­·¯¼­ ÇÑ 10¹ø Á¤µµ ½ÇÇà½ÃÄѺ¸ÀÚ.

¸¸¾à ½Ã±×³Î´ë±â¿­ÀÌ ÀÖ´Ù¸é, sig_hanler´Â 4ÃÊÀÇ °£°ÝÀ» µÎ°í 10¹ø ½ÇÇàµÇ¾î¾ß ÇϰÚÁö¸¸, ´Ü Çѹø¸¸ ½ÇÇàµÇ´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿Ö³ÄÇÏ¸é ´ë±â¿­ÀÌ ¾ø±â ¶§¹®¿¡, sig_handlerÀÌ ½ÇÇàµÈ ÈÄ, ¿ÀÁ÷ ÇϳªÀÇ SIGINT¸¸ Á¢¼ö°¡ µÇ±â ¶§¹®ÀÌ´Ù.

³ª¸ÓÁö ½Ã±×³ÎÀº ÀüºÎ ¹ö·ÁÁø´Ù.

Àǹ̸¦ Àü´ÞÇϱâ À§ÇÑ ¸Å¿ì »ç¿ëÇÏ±â ÆíÇÑ ¹æ¹ýÀÓ¿¡µµ ºÒ±¸Çϰí, ½Ã±×³ÎÀÇ ÀÌ·¯ÇÑ Æ¯Â¡Àº ½Ã±×³ÎÀÇ »ç¿ëÀ» ÁÖÀúÇÏ°Ô ¸¸µå´Â ÀÌÀ¯°¡ µÇ±âµµ ÇÑ´Ù. ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­, ÃÖ±Ù¿¡´Â ½Ã±×³ÎÀÌ ´ë±âÇÒ ¼ö ÀÖ´Â ´ë±â¿­ ¸ÅÄ¿´ÏÁòÀ» Á¦°øÇÏ´Â RTS(real-time signal)ÀÌ »ç¿ëµÇ±âµµ ÇÑ´Ù. RTS¿¡ ´ëÇÑ ³»¿ëÀº ÀÌ ¹®¼­ÀÇ ÈĹݺο¡¼­ µû·Î ´Ù·çµµ·Ï ÇϰڴÙ.

7.2 ºñ½Å·Ú¼º

¿äû¿¡ ´ëÇÑ ÀÀ´äÀ¸·Î ¸Þ½ÃÁö°¡ Àü´ÞµÇ¾ú´ÂÁö È®ÀÎÇÏ´Â ½Ö¹æÇâ Åë½Å°ú´Â ´Þ¸®, ½Ã±×³ÎÀº ÇÁ·Î¼¼½º¿¡ Á¦´ë·Î Àü´ÞµÇ¾ú´ÂÁö È®ÀÎÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ¾ø´Ù.

½ÅÈ£°¡ Àü´ÞµÇ¾ú´ÂÁö¸¦ ½Å·ÚÇÒ ¼ö ¾ø±â ¶§¹®¿¡ ºñ½Å·ÚÀûÀΠƯ¡À» °¡Áø´Ù°í ¸»ÇÑ´Ù.

8 signalÀÇ Á¦¾î

ÀÌÁ¦ ½Ã±×³ÎÀ» Á¦¾îÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ÀÚ¼¼È÷ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ½Ã±×³ÎÀÇ Á¦¾î´Â Å©°Ô 3°¡Áö ºÎºÐÀ¸·Î ÀÌ·ç¾îÁø´Ù.
  1. ½Ã±×³ÎÀÇ Àü¼Û
    ƯÁ¤ ÇÁ·Î¼¼½º, ȤÀº ÀÚ½ÄÇÁ·Î¼¼½º¿Í °°Àº ±×·ìÀÇ ÇÁ·Î¼¼½º¿¡ ½Ã±×³ÎÀ» º¸³»´Â ¹æ¹ý
  2. ½Ã±×³ÎÀÇ catch
    ¿©±â¿¡´Â ½Ã±×³ÎÀ» ±×·ì´ÜÀ§·Î ó¸®Çϰųª ƯÁ¤ ½Ã±×³ÎÀ» ºí·° ÇÏ´Â µî¿¡ ´ëÇÑ ³»¿ëÀÌ µé¾î°£´Ù.
  3. ½Ã±×³ÎÀÇ Ã³¸®

8.1 killÀ» ÀÌ¿ëÇÑ ½Ã±×³ÎÀÇ Àü¼Û

signalÀ» Àü¼ÛÇϱâ À§ÇÑ °¡Àå °£´ÜÇÑ ¹æ¹ýÀº kill(2) ½Ã½ºÅÛÇÔ¼ö¸¦ ÀÌ¿ëÇÏ´Â °ÍÀ¸·Î, killÀÇ »ç¿ë¹æ¹ýÀº ´ÙÀ½°ú °°´Ù. - shellÀÇ kill ¸í·É°ú È¥µ¿ÇÏÁö ¸»ÀÚ. -
#include <sys/types.h> 
#include <signal.h> 
 
int kill(pid_t pid, int sig); 
 
pid´Â ½Ã±×³ÎÀ» ¹ÞÀ» ÇÁ·Î¼¼½ºÀÇ pid·Î ±×·ì ȤÀº ƯÁ¤ pid¿¡ ½Ã±×³ÎÀ» º¸³¾ ¼ö ÀÖ´Ù.
  • pid > 0 : pid¿¡ ´ëÀÀµÇ´Â ÇÁ·Î¼¼½º¿¡ ½Ã±×³ÎÀ» º¸³½´Ù.
  • pid == 0 : ÇöÀçÇÁ·Î¼¼½º¿¡ ¼ÓÇÑ ¸ðµç ±×·ìÀÇ ÇÁ·Î¼¼½º¿¡ ½Ã±×³ÎÀ» º¸³½´Ù.
  • pid == -1 : 1¹ø ÇÁ·Î¼¼½º (init) ¸¦ Á¦¿ÜÇÑ ¸ðµç ÇÁ·Î¼¼½º¿¡ ½Ã±×³ÎÀ» º¸³½´Ù.
  • pid < -1 : pidÀÇ ¸ðµç ±×·ìÀÇ ÇÁ·Î¼¼½º¿¡ signalÀ» º¸³½´Ù.

8.2 signal¸¦ ÀÌ¿ëÇÑ ºñµ¿±âÀû ½Ã±×³Î ó¸®

±×·³ ºñµ¿±âÀûÀ¸·Î ¹ß»ýÇÏ´Â ½Ã±×³ÎÀ» ó¸®ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ºñµ¿±âÀûÀ̶ó´Â °ÍÀº ƯÁ¤ ½ÃÁ¡¿¡¼­ ½Ã±×³ÎÀÌ ¹ß»ýÇÏ´Â °ÍÀ» ±â´Ù¸®Áö ¾Ê´Â´Ù´Â ¾ê±â°¡ µÈ´Ù. Áï ½Ã°£À» ÀÏÄ¡ ½ÃŰÁö ¾Ê°Ú´Ù´Â °ÍÀ¸·Î ÀüÈ­º§ÀÌ ½ÅÈ£¶ó°í ÇÒ¶§, ÀüÈ­º§ÀÌ ¾ðÁ¦ ¿òÁ÷ÀÏ Áö¸¦ ¾Ë ¼ö ¾ø´Ù. ¿ì¸®´Â ÀüÈ­º§À» ±â´Ù¸®Áö ¾Ê´Â´Ù. ÀüÈ­º§ÀÌ ¿òÁ÷ÀÌ¸é ¹ÝÀÀÇÒ »ÓÀÌ´Ù. - ¹°·Ð ±â´Ù¸®´Â ÀüÈ­µµ ÀÖ±ä ÇÏÁö¸¸ -

¸®´ª½º´Â signal(2) À̶ó´Â ÇÔ¼ö¸¦ Á¦°øÇϴµ¥, ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ºñµ¿±âÀûÀ¸·Î ¹ß»ýÇÏ´Â ½Ã±×³Î¿¡ ¹ÝÀÀÇØ¼­ ÇÊ¿äÇÑ ÀÏÀ» ¼öÇà ÇÒ¼ö ÀÖ´Ù. ´ÙÀ½Àº signal ÇÔ¼öÀÇ »ç¿ë¹ýÀÌ´Ù.
#include <signal.h> 
 
void (*signal(int signum, void  (*handler) (int))) (int); 
 
  1. signum : Á¦¾îÇϰíÀÚ ÇÏ´Â ½Ã±×³Î ¹øÈ£
  2. handler : ½Ã±×³ÎÀÌ ¹ß»ýÇßÀ» ¶§, ½ÇÇàÇÒ ÇÔ¼ö

´ÙÀ½Àº signal ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ °£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥À¸·Î, SIGSTOP°¡ Àü´ÞµÇ¸é mystop()¶ó´Â ½Ã±×³Î µî·ÏÇÔ¼ö¸¦ ½ÇÇà½ÃŲ´Ù.
#include <signal.h> 
#include <stdio.h> 
 
void mystop(int signo) 
{ 
  printf("I Received Signal : %d\n", signo); 
} 
 
int main(int argc, char **argv) 
{ 
  int i =0; 
  signal(SIGQUIT, (void *)mystop); 
 
  while(1) 
  { 
    printf("%d\n", i); 
    i++; 
    sleep(1); 
  } 
  return 1; 
} 
 

8.3 signalÀ» ÀÌ¿ëÇÑ µ¿±âÀû ½Ã±×³Î ó¸®

µ¿±âÀû ½Ã±×³Î 󸮶ó´Â °ÍÀº ¿ì¸®°¡ ´Ù¸¥ ÀÏÀ» Á¦ÃÄµÎ°í ¾ÖÀÎÀÇ ÀüÈ­º§À» ±â´Ù¸®´Â °Íó·³, ÀÛ¾÷À» Áß´ÜÇÏ°í ½Ã±×³ÎÀ» ±â´Ù¸®°Ú´Ù¶ó´Â ¾ê±â°¡ µÈ´Ù.

¸®´ª½º´Â sigwait()ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.
#include <signal.h> 
 
int sigwait(const sigset_t *set, int *sig); 
 
sigwait ´Â set¿¡ µî·ÏµÈ ½Ã±×³ÎÀÌ ¹ß»ýµÉ ¶§±îÁö ±â´Ù¸°´Ù. ¿©±â¿¡ sigset_t¶ó´Â µ¥ÀÌÅÍŸÀÔÀÌ µîÀåÇϴµ¥, ¿©±â¿¡´Â ½Ã±×³Î¿¡ ´ëÀÀµÇ´Â bit °ªÀÌ ¼³Á¤µÇ¾î ÀÖ´Ù.

sigwait¸¦ ´Ù·ç±â À§Çؼ­´Â ½Ã±×³ÎÀ» °´Ã¼·Î ´Ù·ç´Â ¹æ¹ý¿¡ ´ëÇÑ Áö½ÄÀÌ ÇÊ¿äÇÏ´Ù. sigaction ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¸é ½Ã±×³ÎÀ» °´Ã¼´ÜÀ§·Î ´Ù·ê ¼ö Àִµ¥, (´ÙÀ½ Àý¿¡¼­) sigactionÀ» ´Ù·ç¸é¼­ sigwaitÀÇ »ç¿ë¹æ¹ý¿¡ ´ëÇØ¼­ ¼³¸íÇϵµ·Ï ÇϰڴÙ.

9 sigaction ÇÔ¼ö±º À» ÀÌ¿ëÇÑ ½Ã±×³Î °´Ã¼ÀÇ Ã³¸®

signal ÇÔ¼ö´Â °£´ÜÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ±â´Â ÇÏÁö¸¸ ½Ã±×³ÎÀ» °´Ã¼·Î º¸Áö ¾Ê°í, ´ÜÀÏ ´ë»óÀ¸·Î º»´Ù´Â ¹®Á¦Á¡À» °¡Áø´Ù. sigactionÀ» »ç¿ëÇÏ¸é ½Ã±×³ÎÀ» °´Ã¼·Î ´Ù·ê ¼ö Àִµ¥, ÀÌ °´Ã¼¿¡´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ Æ÷ÇԵȴÙ.
  • ½Ã±×³Î set
  • ½Ã±×³Î¿¡ ´ëÇÑ Á¤Ã¥
  • ½Ã±×³Î ÇÔ¼ö
ÀÌ·¯ÇÑ ¿ä¼ÒµéÀ» ÇϳªÀÇ °´Ã¼·Î º¼ °æ¿ì ºÐ¸íÈ÷ ´õ ½±°Ô ½Ã±×³ÎÀ» °ü¸®ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸®´ª½º´Â À̵éÀ» °´Ã¼·Î ´Ù·ç±â À§Çؼ­ sigaction() ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. ÀÌ ÇÔ¼ö´Â struct sigactionÀ» ÀÌ¿ëÇØ¼­ ½Ã±×³Î °´Ã¼¿ä¼Ò¸¦ ´Ù·é´Ù.
#include <signal.h> 
int sigaction(int signum,  const  struct  sigaction  *act, 
    struct sigaction *oldact); 
 
  1. signum : Á¦¾îÇÒ ½Ã±×³ÎÀÇ ¹øÈ£
  2. act : ½Ã±×³ÎÀ» Á¦¾îÇϱâÀ§ÇÑ Á¤Ã¥À» Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.

    struct sigaction  
    { 
        void (*sa_handler) (int); 
        void (*sa_sigaction) (int, siginfo_t *, void *); 
        sigset_t sa_mask; 
        int sa_flags; 
        void (*sa_restorer) (void); 
    } 
     
±¸Á¶Ã¼ÀÇ °¢ ¸â¹ö¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº sigaction(2) ¹®¼­¸¦ È®ÀÎÇØ º¸±â ¹Ù¶õ´Ù. ¿©±â¿¡¼­´Â °£´ÜÇÏ°Ô ¼Ò°³¸¸ ÇÏ°í ³Ñ¾î°¡°Ú´Ù.
  1. sa_handler : sigactionÀÇ signum¿¡ ÇØ´çµÇ´Â ½Ã±×³ÎÀÌ Àü´ÞµÇ¾úÀ» ¶§ ½ÇÇàµÉ ½Ã±×³Î Çڵ鷯
  2. sa_mask : sa_handler¿¡ µî·ÏµÈ ½Ã±×³Î Çڵ鷯°¡ ½ÇÇàµÇ´Â µ¿¾È ºí·°µÇ¾î¾ß ÇÏ´Â ½Ã±×³Î¸¶½ºÅ©

sigactionÀº ½Ã±×³ÎÀ» °´Ã¼´ÜÀ§·Î Á¦¾îÇÒ ¼ö ÀÖÀ½À» ¾Ë°Ô µÇ¾ú´Ù. À̶§ Áß¿äÇÑ ½Ã±×³Î Á¤Ã¥ÀÌ, ½Ã±×³Î Çڵ鷯°¡ ¼öÇàµÇ´Â µµÁß¿¡ ¹ß»ýÇÏ´Â ½Ã±×³ÎµéÀ» set·Î ¹­¾î¼­ °ü¸®ÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô ½Ã±×³ÎÀ» set À¸·Î °ü¸®Çϱâ À§Çؼ­ ´ÙÀ½ÀÇ ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù.
int sigprocmask(int  how,  const  sigset_t *set, sigset_t *oldset); 
int sigpending(sigset_t *set); 
int sigismember(sigset_t *set, int signum); 
int sigsuspend(const sigset_t *mask); 
int sigfillset(sigset_t *set); 
int sigaddset(sigset_t *set, int signum); 
int sigemptyset(sigset_t *set); 
int sigdelset(sigset_t *set, int signo); 
 
  1. sigprocmask : À̰ÍÀº ÇöÀç setÀ¸·Î µî·ÏµÈ ½Ã±×³ÎÀÇ ºí·° Á¤Ã¥À» º¯°æÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ºí·°Á¤Ã¥¿¡´Â ´ÙÀ½ÀÇ 3°¡Áö°¡ ÀÖ´Ù. ºí·°set¿¡ Ãß°¡µÇ¾î ÀÖ´Ù¸é, ½Ã±×³ÎÀº ¹Ù·Î Àü´ÞµÇÁö ¾Ê°í handler°¡ ³¡³¯¶§±îÁö ºí·°µÈ´Ù.
    1. SIG_BLOCK : set¿¡ ¼³Á¤µÈ ½Ã±×³Î¼ÂÀ» ±âÁ¸ ºí·°set¿¡ Ãß°¡ÇÑ´Ù.
    2. SIG_UNBLOCK : set¿¡ ¼³Á¤µÈ ½Ã±×³Î ¼ÂÀ» ±âÁ¸ ºí·°set¿¡¼­ »«´Ù.
    3. SIG_SETMASK : setÀÇ ½Ã±×³Î¼ÂÀ» ºí·°set Á¤Ã¥À¸·Î ÇÑ´Ù.
  2. sigpending : ½Ã±×³ÎÀÌ ºí·ÏµÈ »óÅ¿¡¼­ ¾î¶² ½Ã±×³ÎÀÌ ¹ß»ýÇØ¼­ ºí·ÏµÇ¾ú´ÂÁö¸¦ ¾Ë ¼ö ÀÖ´Ù.
  3. sigismember : signumÀÌ ½Ã±×³Î set¿¡ Æ÷ÇԵǾî ÀÖ´ÂÁö È®ÀÎÇÑ´Ù. sigpending¿Í ÇÔ²² »ç¿ëÇϸé, ¾î¶² ½Ã±×³Î¿¡ ´ëÇØ¼­ ºí·ÏµÇ¾ú´ÂÁö¸¦ ¾Ë°í ÀÌ¿¡ ´ëÇÑ Ã³¸®¸¦ ÇÒ ¼ö ÀÖ´Ù.

    #include <stdio.h> 
    #include <unistd.h> 
    #include <signal.h> 
     
    int main(int argc, char **argv) 
    { 
      sigset_t sigset; 
      sigset_t pendingset; 
      int i = 0; 
     
      // ¸ðµç ½Ã±×³Î¿¡ ´ëÇØ¼­ BLOCK ÇÑ´Ù. 
      sigfillset(&sigset); 
      sigprocmask(SIG_BLOCK, &sigset, NULL); 
     
      printf("My PID  %d\n", getpid()); 
      while(1) 
      { 
        printf("%d\n", i); 
        i++; 
        sleep(1); 
        // BLOCKµÈ ½Ã±×³ÎÀÌ ÀÖ´Ù¸é 
        if (sigpending(&pendingset) == 0) 
        { 
          // ±×¸®°í BLOCKµÈ ½Ã±×³ÎÀÌ SIGUSR1 À̶ó¸é 
          // ·çÇÁ¸¦ ºüÁ®³ª°£´Ù. 
          if (sigismember(&pendingset, SIGUSR1)) 
          { 
            printf("BLOCKED Signal : SIGUSR1\n"); 
            break; 
          } 
        } 
      } 
      return 0; 
    } 
     
  4. sigfillset : ¸ðµç ½Ã±×³Î¼ÂÀÇ bit flag¸¦ onÀ¸·Î ÇÑ´Ù. ¿¹¸¦µé¾î ¸ðµç ½Ã±×³Î¿¡ ´ëÇØ¼­ SIG_BLOCK¸¦ Àû¿ëÇÏ±æ ¿øÇÑ´Ù¸é, ¾Æ·¡¿Í °°ÀÌ ÇÏ¸é µÈ´Ù.

    sigset_t sigset, oldset; 
    sigfillset(&sigset); 
    sigprocmask(SIG_BLOCK, &sigset, &oldset); 
     
  5. sigaddset : signum ¹øÈ£¸¦ °¡Áö´Â ½Ã±×³ÎÀ» set¿¡ Ãß°¡ÇÑ´Ù.
  6. sigemptyset : setÀ» ¸ðµÎ ºñ¿î´Ù.
  7. sigdelset : signum ¹øÈ£¸¦ °¡Áö´Â ½Ã±×³ÎÀ» set¿¡¼­ Áö¿î´Ù.

±×·³ °£´ÜÇÑ ÇÁ·Î±×·¥À» Çϳª ¸¸µé¾îº¸µµ·Ï ÇϰڴÙ.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <signal.h>  
#include <unistd.h>  
#include <string.h>  
#include <stdio.h>  
 
void sig_int(int signo); 
void sig_usr(int signo); 
 
int main() 
{ 
    int i = 0; 
    struct sigaction intsig, usrsig; 
 
    printf("PID : %d\n", getpid()); 
    // SIGUSR2 ½Ã±×³ÎÀÇ Ã³¸® ---------- 
    usrsig.sa_handler = sig_usr;  // ½Ã±×³Î Çڵ鷯 µî·Ï 
    sigemptyset(&usrsig.sa_mask); // ½Ã±×³Î ¸¶½ºÅ© ÃʱâÈ­ 
    usrsig.sa_flags = 0; 
    if (sigaction(SIGUSR2, &usrsig, 0) == -1) 
    { 
        printf ("signal(SIGUSR2) error"); 
        return -1; 
    }     
    // --------------------------------- 
 
    // SIGINT (CTRL+C) ½Ã±×³ÎÀÇ Ã³¸® --- 
    intsig.sa_handler = sig_int; 
    sigemptyset(&intsig.sa_mask); 
    intsig.sa_flags = 0; 
    if (sigaction(SIGINT, &intsig, 0) == -1) 
    { 
        printf ("signal(SIGINT) error"); 
        return -1; 
    }     
    // --------------------------------- 
 
    while(1) 
    { 
        printf("%d\n", i); 
        i++; 
        sleep(1); 
    } 
} 
 
void sig_int(int signo) 
{ 
    sigset_t sigset, oldset; 
    sigemptyset(&oldset); 
 
    // SIGUSR2¿Í SIGUSR1Àº ºí·°µÈ´Ù. 
    // ÀÌµé ½Ã±×³ÎÀº Çڵ鷯°¡ Á¾·áµÇ¸é Àü´ÞµÈ´Ù. 
    sigemptyset(&sigset); 
    sigaddset(&sigset, SIGUSR2); 
    sigaddset(&sigset, SIGUSR1); 
    if (sigprocmask(SIG_BLOCK, &sigset, &oldset) < 0) 
    { 
        printf("sigprocmask %d error \n", signo); 
    } 
 
    // SIGINT ¸¦ UNBLOCK ÇÑ´Ù. 
    // Çڵ鷯°¡ ¼öÇàÁßÀÌ´õ¶óµµ Áï½Ã Àü´ÞµÈ´Ù. 
    sigemptyset(&sigset); 
    sigaddset(&sigset, SIGINT); 
    if (sigprocmask(SIG_UNBLOCK, &sigset, &oldset) < 0) 
    { 
        printf("sigprocmask %d error \n", signo); 
    } 
 
    printf("sig_int\n"); 
    sleep(5); 
} 
 
void sig_usr(int signo) 
{ 
    printf("sig_usr2\n"); 
} 
 
  • 50~58 : SIGUSR1°ú SIGUSR2 ½Ã±×³ÎÀ» ºí·°½ÃÄ×´Ù. Çڵ鷯°¡ ¼öÇàµÇ´Â 5Ãʵ¿¾È ÀÌµé ½Ã±×³ÎÀÌ µµÂøÇϸé, ½Ã±×³ÎÀº BLOCKÀÌ µÈ´Ù. ±×·¯´Ù°¡ ½Ã±×³ÎÇڵ鷯°¡ Á¾·áÇϸé, Àü´ÞÀÌ µÈ´Ù.
  • 60 ~68 : SIGINT¸¦ UNBLOCK·Î Çß´Ù. ½Ã±×³ÎÇڵ鷯°¡ ¼öÇàµÇ´Â µ¿¾È µ¿ÀÏÇÑ ½Ã±×³ÎÀÌ ¹ß»ýÇÏ°Ô µÇ¸é, ½Ã±×³ÎÀº BLOCKÀÌ µÈ´Ù. SIGINT¿¡ ´ëÇØ¼­ UNBLOCK¸¦ ÇßÀ¸¹Ç·Î SIGINT°¡ µµÂøÇÏ°Ô µÇ¸é, °ð¹Ù·Î ½Ã±×³ÎÀÌ Àü´ÞµÇ°í sig_int ½Ã±×³ÎÇڵ鷯°¡ ¼öÇàÀÌ µÈ´Ù. ÀÌ Äڵ带 ÁÖ¼®Ã³¸® ÇÑ´ÙÀ½¿¡ SIGINT¸¦ ¿©·¯¹ø ¹ß»ý½ÃÄѺ¸±â ¹Ù¶õ´Ù.

10 ¸¶Ä¡¸ç

ÀÌ»ó °£´ÜÇÏ°Ô ½Ã±×³Î¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù. ½Ã±×³ÎÀÇ È°¿ë°ú °ü·ÃµÈ ³»¿ëÀº thread¸¦ ¼³¸íÇÏ´Â ÀåÀ» ºñ·ÔÇÑ ´Ù¸¥ ¸î¸î Àå¿¡¼­, ´Ù·ç°Ô µÉ °ÍÀÌ´Ù.

À̱ÛÀº joinc ºí·Î±×·Î ¹ßÇàµÇ¾ú½À´Ï´Ù. ´ñ±ÛÀº ºí·Î±×¿¡¼­ ÀÔ·ÂÇÒ ¼ö ÀÖ½À´Ï´Ù.