21.½Ã±×³¯ ó¸®.
½Ã±×³¯(¾ÕÀ¸·Î ½ÅÈ£¶ó ÇØ¼®ÇÏÁö ¾Ê°í ½Ã±×³¯À̶ó°í ÇϰڽÀ´Ï´Ù. ±×°ÍÀÌ ´õ ÁÁÀ» °Í °°¾Æ¼...)Àº ÇÁ·Î¼¼½º¿¡°Ô ¹è´ÞµÈ ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ®ÀÌ´Ù. ¿î¿µÃ¼Á¦´Â ½ÇÇàÇϰí ÀÖ´Â ÇÁ·Î±×·¥¿¡ ¿¹¿ÜÀûÀÎ »ó ȲÀ» º¸°íÇϱâ À§Çؼ ½Ã±×³¯À» »ç¿ëÇÑ´Ù. ¾î¶² ½Ã±×³¯µéÀº À¯¿ëÇÏÁö ¾ÊÀº ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ÂüÁ¶
Çϴ°Ͱú °°Àº ¿¡·¯¸¦ º¸°íÇϰí; ´Ù¸¥ °ÍÀº Àüȼ±ÀÇ ´ÜÀý°ú °°Àº, ºñµ¿±âÀû »ç°ÇÀ» º¸°íÇÑ´Ù.
GNU C ¶óÀ̺귯¸®´Â °¢°¢ÀÇ Æ¯Á¤ÇÑ »ç°ÇµéÀÇ Á¾·ù¿¡ µû¶ó, ´Ù¾çÇÑ ½Ã±×³¯ÀÇ ÇüŸ¦ Á¤ÀÇÇÑ´Ù. »ç °ÇµéÀÇ ¾î¶² Á¾·ùµéÀº º¸Åë ÇÁ·Î±×·¥ÀÇ °è¼ÓµÈ ÁøÇàÀ»±ÇÀåÇÒ ¼ö ¾ø°Å³ª ºÒ°¡´ÉÇÏ°Ô Çϰí, ±×¿¡ ÇØ´ç ÇÏ´Â ½Ã±×³¯µéÀº º¸Åë ±× ÇÁ·Î±×·¥À» ÁßÁö½ÃŲ´Ù., À¯ÇØÇÏÁö ¾ÊÀº »ç°ÇµéÀ» º¸°íÇÑ ´Ù¸¥ Á¾·ùÀÇ ½Ã ±×³¯µéÀº º¸Åë ¹«½ÃµÈ´Ù.
¸¸ÀÏ ´ç½ÅÀÌ ½Ã±×³¯ÀÌ ¹ß»ýÇÑ »ç°ÇÀ» ¿¹»óÇÑ´Ù¸é, ´ç½ÅÀº ½Ã±×³¯ ó¸® ÇÔ¼ö¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ°í Æ¯Á¤ ÇÑ ÇüÅÂÀÇ ½Ã±×³¯ÀÌ µµÂøÇßÀ» ¶§ ¿î¿µÃ¼Á¦°¡ ±× ½Ã±×³¯ ó¸®ÇÔ¼ö¸¦ ½ÇÇàÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù. ÃÖÁ¾ÀûÀ¸ ·Î, ÇϳªÀÇ ÇÁ·Î¼¼½º´Â ´Ù¸¥ ÇÁ·Î¼¼½º¿¡°Ô ÇÑ °³ÀÇ ½ÅÈ£¸¦ º¸³½´Ù; À̰ÍÀº ºÎ¸ð ÇÁ·Î¼¼½º°¡ ÀÚ½Ä ÇÁ ·Î¼¼½º¸¦ ÁßÁö½ÃŰ´Â °ÍÀ» Çã¿ëÇϰųª, ¶Ç´Â µÎ °³ÀÇ ¿¬°üµÈ ÇÁ·Î¼¼½º°¡ Åë½ÅÇϰųª µ¿±âÇϵµ·Ï ÇÏ ´Â °ÍÀ» Çã¿ëÇÑ´Ù.
21.1. ½Ã±×³¯µéÀÇ ±âº» ¿øÄ¢.
¾î¶»°Ô ½Ã±×³¯µéÀÌ ¹ß»ýµÇ°í, ½Ã±×³¯ÀÌ µµÂøµÈ ÀÌÈÄ¿¡ ¹«½¼ÀÏÀÌ ¹ß»ýÇÒ °ÍÀ̸ç, ¾î¶»°Ô ÇÁ·Î±×·¥ÀÌ ½Ã±×³¯À» ó¸®ÇÒ ¼ö ÀÖ´ÂÁö¿¡ ´ëÇÑ ±âº» ¿øÄ¢µéÀ» ¼³¸íÇÑ´Ù.
21.1.1 ½Ã±×³¯µéÀÇ Á¾·ù.
½ÅÈ£´Â ¿¹¿ÜÀûÀÎ »ç°ÇÀÇ ¹ß»ýÀ» º¸°íÇÑ´Ù. ´ÙÀ½Àº ½Ã±×³¯À» ¹ß»ý½ÃŰ´Â ¾î¶² ¿¹¿ÜÀûÀÎ »ç°ÇµéÀÌ´Ù.
둁 ÇÁ·Î±×·¥ÀÌ 0À¸·Î ³ª´©´Â ÀÏÀ» Çϰųª, ¶Ç´Â À¯¿ëÇÑ ¹üÀ§¸¦ ³Ñ¾î¼´Â ÁÖ¼Ò¸¦ ¾ï¼¼½ºÇÏ·Á´Â°Í°ú °°Àº ¿¡·¯.
둁 »ç¿ëÀÚ°¡ ÇÁ·Î±×·¥À» ÀÎÅÍ·´Æ® ¶Ç´Â ÁßÁöÇϵµ·Ï ¿äûÇÑ´Ù. ´ëºÎºÐÀÇ È¯°æµéÀº »ç¿ëÀÚ°¡ C-z¸¦ ŸÀÌÇÎÇϸé ÀϽà ÁßÁöÇϰųª, C-c¸¦ ŸÀÌÇÎÇϸé Á¾·á¸¦ Çã¿ëÇϵµ·Ï ¸¸µé¾îÁ³´Ù. Ű ½ÃÄö½º( key sequence)¿¡ ¹«¾ùÀÌ »ç¿ëµÇ¾ú´øÁö, ¿î¿µÃ¼Á¦´Â ÇÁ·Î¼¼½º¸¦ ÀÎÅÍ·´Æ® ÇϱâÀ§ÇÑ Àû´çÇÑ ½Ã±×³¯À» º¸³½ ´Ù.
둁 ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ Á¾·á.
둁 ŸÀ̸ӳª ¾Ë¶÷ÀÇ °æ°ú.
둁 °°Àº ÇÁ·Î¼¼½º¿¡ ÀÇÇØ Á×À̰ųª ¹ß»ýÇÑ È£Ãâ.
둁 ´Ù¸¥ ÇÁ·Î¼¼½º·Î ºÎÅÍ Á×À̱â À§ÇÑ È£Ãâ. ½Ã±×³¯µéÀº ÇÁ·Î¼¼½º»çÀÌÀÇ Åë½Å¿¡ À¯¿ëÇÑ Çü½ÄÀÌÁö¸¸ Á¦ÇÑÀ» °®´Â´Ù.
ÀÌµé »ç°Çµé(Á×À̰ųª ¹ß»ýÇϱâ À§ÇØ ¸í¹éÇÏ°Ô È£ÃâÇÑ °ÍÀ» Á¦¿ÜÇϰí )ÀÇ °¢°¢Àº ÀڽŸ¸ÀÇ Æ¯Á¤ÇÑ Á¾·ùÀÇ ½ÅÈ£¸¦ ¹ß»ý½ÃŲ´Ù. ´Ù¾çÇÑ Á¾·ùÀÇ ½Ã±×³¯ µéÀº 21.2Àý [Standard Signals] 272 ÆäÀÌÁö¿¡ »ó ¼¼ÇÏ°Ô ¼³¸íµÇ¾ú´Ù.
21.1.2 ½Ã±×³¯ ¹ß»ýÀÇ ¿øÄ¢µé.
ÀϹÝÀûÀ¸·Î, ½Ã±×³¯À» ¹ß»ý½ÃŰ´Â »ç°ÇµéÀº ¼¼°¡Áö·Î ³ª´ ¼ö ÀÖ´Ù: ¿¡·¯µé. ¿ÜºÎÀÇ »ç°Çµé°ú ¸í¹é ÇÑ ¿äû.
¿¡·¯´Â ÇÁ·Î±×·¥ÀÌ ¹«¾ð°¡ À¯¿ëÇÏÁö ¾ÊÀ» ÀÏÀ» ÇÏ°í ½ÇÇàÀ» °è¼ÓÇÒ ¼ö ¾ø´Â °ÍÀ» ÀǹÌÇÑ´Ù. ±×·¯ ³ª ¿¡·¯µéÀÇ ¸ðµç Á¾·ù°¡ ½Ã±×³¯À» ¹ß»ý½ÃŰÁö´Â ¾Ê´Â´Ù_½ÇÁ¦·Î ±×µéÀÇ ´ëºÎºÐÀº ½Ã±×³¯À» ¹ß»ý½Ã ŰÁö¸¸... ¿¹¸¦µé¾î, Á¸ÀçÇÏÁö¾Ê´Â ÆÄÀÏÀ» °³¹æÇϱâ¿Í °°Àº °ÍÀº ¿¡·¯ÀÌÁö¸¸, ±×°ÍÀº ½Ã±×³¯À» ¹ß»ý½Ã ŰÁö ¾Ê°í; ´ë½Å¿¡ openÀº -1À» ¸®ÅÏÇÑ´Ù. ÀϹÝÀûÀ¸·Î, ¿¡·¯µéÀº ¿¡·¯¸¦ ÁöÀûÇÏ´Â °ªÀ» ¸®ÅÏÇÔÀ¸·Î ½á º¸°íµÇ´Â ¾î¶² ¶óÀ̺귯¸® ÇÔ¼öµé°ú ¿¬°üµÇ¾îÀÖ´Ù. ½Ã±×³¯µéÀ» ¹ß»ý½ÃŲ ¿¡·¯µéÀº ´ÜÁö ¶óÀÌºê ·¯¸® È£Ãâ»Ó¸¸ ¾Æ´Ï¶ó ÇÁ·Î±×·¥ÀÇ ¾îµð¼µç ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ±×µé¿¡´Â 0À¸·Î ³ª´©±â¸¦ Çϰí À¯¿ëÇÏ Áö ¾ÊÀº ¸Þ¸ð¸® ÁÖ¼ÒÀÇ ÂüÁ¶°¡ Æ÷ÇԵȴÙ.
¿ÜºÎ¿¡¼ ¹ß»ýÇÑ »ç°ÇÀº ÀÔ/Ãâ·ÂÀ̳ª ´Ù¸¥ ÇÁ·Î¼¼½ºµé°ú ÇÔ²² ÇÏ´Â °Í¿¡¼ ³ª¿Â´Ù. ±×µé¿¡´Â ÀÔ·Â ÀÇ µµÂø, ŸÀ̸ÓÀÇ °æ°ú, ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ Á¾·áµîÀÌ Æ÷ÇԵȴÙ.
¸í¹éÇÑ ¿äûÀº killó·³ Ưº°ÇÏ°Ô ½Ã±×³¯À» ¹ß»ýÇϵµ·Ï ¾î¶² ¸ñÀûÀ» °¡Áø ¶óÀ̺귯¸® ÇÔ¼öÀÇ »ç¿ëÀ» ÀǹÌÇÑ´Ù.
½Ã±×³¯µéÀº µ¿±âÀûÀ¸·Î ¶Ç´Â ºñµ¿±âÀûÀ¸·Î ¹ß»ýµÇ¾îÁø´Ù. µ¿±âÀû ½Ã±×³¯ Àº ÇÁ·Î±×·¥ÀÇ ¾î´À Á¤ÇØ Áø µ¿ÀÛ°ú °ü°èÇϰí, ±× µ¿ÀÛÀ» ÇÏ´Â µ¿¾È(ºí·ÏµÈ °ÍÀÌ ¾Æ´Ï¶ó¸é)¿¡ ¹è´Þ µÇ¾îÁø´Ù.. ¿¡·¯µéÀº µ¿±â ÀûÀ¸·Î ½Ã±×³¯À» ¹ß»ýÇϰí, ÇÁ·Î¼¼½º°¡ °°Àº ÇÁ·Î¼¼½º¸¦ À§ÇÏ¿© ½Ã±×³¯À» ¹ß»ýÇϵµ·Ï ÇÔÀ¸·Î½á ¸í¹é ÇÏ°Ô ¿äûÇÑ´Ù.
ºñµ¿±âÀû ½Ã±×³¯µéÀº ½Ã±×³¯À» ¹ÞÀº ÇÁ·Î¼¼½ºÀÇ Á¦¾îÀÇ ¹Û¿¡¼ ¹ß»ýÇÑ »ç°Ç¿¡ ÀÇÇØ ¹ß»ýµÇ¾îÁø´Ù. ±×µé ½Ã±×³¯µéÀº ½ÇÇൿ¾È¿¡ ¿¹ÃøÇÒ ¼ö ¾ø´Â ½Ã°£¿¡ µµÂøµÈ´Ù. ¿ÜºÎÀÇ »ç°ÇµéÀº ºñµ¿±âÀûÀ¸·Î ½Ã±× ³¯µéÀ» ¹ß»ýÇϰí, ¾î¶² ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ Àû¿ëÇϵµ·Ï ¸í¹éÇÏ°Ô ¿äûÇÑ´Ù.
½Ã±×³¯ÀÇ ÁÖ¾îÁø ÇüÅ´ ÀüÇüÀûÀ¸·Î µ¿±âÀûÀ̰ųª ¶Ç´Â ºñµ¿±âÀûÁß¿¡ Çϳª°¡ µÈ´Ù. ¿¹¸¦µé¾î, ¿¡·¯ ¸¦ À§ÇÑ ½Ã±×³¯Àº ¿¡·¯°¡ µ¿±âÀûÀ¸·Î ½ÅÈ£¸¦ ¹ß»ýÇß´Ù¸é ÀüÇüÀûÀ¸·Î µ¿±âÀûÀÌ´Ù. ±×·¯³ª ¾î´À ½Ã±× ³¯ÀÇ ÇüÅ´ ¸í¹éÇÑ ¿äûÀ¸·Î´Â µ¿±âÀû, ¶Ç´Â ºñµ¿±âÀûÀ¸·Î ¹ß»ýµÇ¾îÁú ¼ö ÀÖ´Ù.
21.1.3 ¾î¶»°Ô ½ÅÈ£µéÀÌ ¹è´ÞµÇ´Â°¡.
½Ã±×³¯ÀÌ ¹ß»ýµÇ¾îÁ³À» ¶§, ±×¶§´Â ¾ÆÁ÷ ¹ÌÇØ°áÀÎ »óŰ¡ µÈ´Ù. ÀϹÝÀûÀ¸·Î ¾ÆÁÖ ÂªÀº ½Ã°£µ¿¾È¸¸ ¹ÌÇØ°áÀÎä·Î ³²¾ÆÀÖ°í ±× ´ÙÀ½¿¡´Â ½ÅÈ£°¡ ÇÁ·Î¼¼½º¿¡°Ô ¹è´ÞµÇ¾îÁø´Ù. ±×·¸Áö¸¸ ¸¸ÀÏ ½Ã±×³¯ÀÇ Á¾·ù°¡ ºí·ÏµÇ¾îÁ³´Ù¸é, ±×°ÍÀº ¸·¿¬È÷ ¹ÌÇØ°áÀÎü·Î ³²¾ÆÀÖ°Ô µÉ°ÍÀÌ´Ù_±× ½Ã±×³¯ÀÇ ºí·ÏÀÌ ÇØÁ¦µÉ ¶§±îÁö. ÀÏ´Ü ºí·ÏÀÌ ÇØÁ¦µÇ¸é, ±×°ÍÀº Áï½Ã ¹è´ÞµÇ¾îÁú °ÍÀÌ´Ù. 21.7Àý [Blocking Signals] 298 Æä ÀÌÁö ÂüÁ¶.
½Ã±×³¯ÀÌ ¹è´ÞµÇ¾úÀ» ¶§, Áï½Ã ¶Ç´Â ±ä Áö¿¬ÈÄ¿¡ ±× ½Ã±×³¯À» À§ÇÏ¿© Á¤ÇØÁø ÇൿÀ» ÇÏ°Ô µÈ´Ù. SIGKILL °ú SIGSTOP ¿Í °°Àº ¾î¶² ½Ã±×³¯µéÀº ±× ÇൿÀÌ Á¤ÇØÁ®ÀÖÁö¸¸, ´ëºÎºÐÀÇ ½Ã±×³¯µéÀº ÇÁ ·Î±×·¥ÀÌ ¼±ÅÃÇÏ°Ô µÈ´Ù: ½Ã±×³¯À» ¹«½ÃÇϰųª, ó¸® ÇÔ¼ö¸¦ ÁöÁ¤Çϰųª, ¶Ç´Â ½Ã±×³¯ÀÇ Á¾·ù ¿¡ µû ¶ó µðÆúÆ® µ¿ÀÛÀ» Çϰųª. ÇÁ·Î±×·¥Àº signalÀ̳ª sigaction°ú °°Àº ÇÔ¼öµéÀ» »ç¿ëÇØ¼ ¼±ÅÃÀ» ÇÏ°Ô µÈ´Ù(21.3Àý [Signal Actions] 279 ÆäÀÌÁöÂüÁ¶. ). ¿ì¸®´Â ¶§¶§·Î Çڵ鷯°¡ ½Ã±×³¯À» Àâ¾Ò´Ù°í ¾ê±â ¸¦ ÇÑ´Ù.
Çڵ鷯°¡ ½ÇÇàµÇ°í ÀÖ´Â µ¿¾È, ƯÁ¤ÇÑ ½Ã±×³¯Àº ÀϹÝÀûÀ¸·Î ºí·ÏµÇ¾îÁø´Ù. ¸¸ÀÏ ÇÑ Á¾·ùÀÇ ½Ã±×³¯À» À§ÇÑ Á¤ÇØÁø µ¿ÀÛÀÌ ½Ã±×³¯À» ¹«½ÃÇϴ°ÍÀ̶ó¸é,¹ß»ýµÇ¾îÁø ½Ã±×³¯Àº Áï½Ã ¹ö·ÁÁø´Ù À̰ÍÀº ½ÉÁö¾î ½Ã±×³¯ÀÌ µ¿½Ã¿¡ ºí·Ï µÇ¾îÁúÁö¶óµµ ¹ß»ýÇÑ´Ù. ÀÌ·¸°Ô ¹ö·ÁÁø ½Ã±×³¯Àº ºñ·Ï ÇÁ·Î±×·¥ÀÌ ¿¬¼ÓÀû À¸ ·Î ±× Á¾·ùÀÇ ½Ã±×³¯À» À§ÇÏ¿© ´Ù¸¥ µ¿ÀÛÀ» ÁöÁ¤ÇÏ°í ºí·ÏÀ» ÇØÁ¦ÇÏÁö ¾Ê¾ÒÀ»Áö¶óµµ °áÄÚ ¹è´ÞµÇÁö ¾ÊÀ» °ÍÀÌ´Ù.
ÇÁ·Î±×·¥¿¡¼ 󸮵ÇÁöµµ ¾Ê°í ¹«½ÃÇÏÁöµµ ¾Ê´Â ½ÅÈ£°¡ ¹ß»ýÇϸé, ±×°ÍÀÇ
µðÆúÆ® µ¿ÀÛÀÌ ÀϾÙ. ½Ã±×³¯ÀÇ °¢ Á¾·ùµéÀº ¹Ø¿¡ ¼³¸íµÈ ÀÚ½ÅÀÇ µðÆúÆ® µ¿ÀÛÀ» °®´Â´Ù(21.2Àý [Standard Signals] 272 ÆäÀÌÁö ÂüÁ¶.). ´ëºÎºÐÀÇ ½Ã±×³¯¿¡¼ µðÆúÆ® µ¿ÀÛÀº ÇÁ·Î¼¼½º¸¦ Á¾·áÇÏ´Â °Í ÀÌ´Ù. "À¯ÇØÇÏÁö ¾ÊÀº" »ç°Çµé¿¡¼ ¹ß»ýÇÑ ¾î¶² Á¾·ùÀÇ ½Ã±×³¯µéÀÇ µðÆúÆ® µ¿ÀÛÀº ¾Æ¹«°Íµµ ÇÏÁö¾Ê ´Â °ÍÀÌ´Ù.
ÇÑ ½Ã±×³¯ÀÌ ÇÁ·Î¼¼½º¸¦ Á¾·áÇÒ ¶§, ±×°ÍÀÇ ºÎ¸ð ÇÁ·Î¼¼½º´Â wait ¶Ç´Â waitpid ÇÔ¼öµé¿¡ ÀÇÇØ º¸ °íµÈ Á¾·á »óȲ Äڵ带 Á¶»çÇÔÀ¸·Î½á Á¾·á°¡ ¹ß»ýÇÑ ¿øÀÎÀ» ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. (À̰Ϳ¡ ´ëÇØ¼´Â 23.6 Àý [Process Completion] 329 ÆäÀÌÁö¿¡ Á»´õ ÀÚ¼¼ÇÏ°Ô ³ª¿ÍÀÖ´Ù.) ½Ã±×³¯ÀÇ ¿øÀÎÀÌ µÈ Á¾·áÀÇ ¿ä¼Ò, ±×¸®°í ½Ã±×³¯ÀÇ Á¾·á¸¦ Æ÷ÇÔÇØ¼ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ¸¸ÀÏ ½©·ÎºÎÅÍ ´ç½ÅÀÌ ½ÇÇàÇϰí ÀÖ´Â ¾î¶² ÇÁ·Î±×·¥ÀÌ ½Ã±×³¯¿¡ ÀÇÇØ Á¾·á°¡ µÈ´Ù¸é, ±× ½©Àº ±×°Í¿¡ ÇØ´çÇÏ´Â ¿¡·¯¸Þ¼¼Áö¸¦ ÇÁ¸°Æ® ÇÒ °ÍÀÌ´Ù. ÇÁ·Î±×·¥ÀÇ ¿¡·¯¸¦ Ç¥ÇöÇÏ´Â ½Ã±×³¯µéÀº Ưº°ÇÑ ¼Ó¼ºÀ» °®´Â´Ù: ½Ã±×³¯ ÁßÀÇ Çϳª°¡ ÇÁ·Î¼¼½º¸¦ Á¾ ·áÇÒ ¶§, Á¾·áÇÑ ½Ã°£¿¡ ÇÁ·Î¼¼½ºÀÇ »óȲ¿¡ ´ëÇÑ ±â·ÏÀ» ÄÚ¾Æ ´ýÇÁ ÆÄÀÏ¿¡ ±â·ÏÇÑ´Ù. ´ç½ÅÀº ¹«½¼ ¿¡·¯°¡ ¹ß»ýÇß´ÂÁö Á¶»ç Çϱâ À§Çؼ µð¹ö°Å¸¦ »ç¿ëÇØ¼ ÄÚ¾Æ ´ýÇÁ ÆÄÀÏÀ» Á¶»çÇÒ ¼ö ÀÖ´Ù.
¸¸ÀÏ ´ç½ÅÀÇ ¸í¹éÇÑ ¿äû¿¡ ÀÇÇØ¼ ÇÁ·Î¼¼½º¸¦ Á¾·áÇϰí "ÇÁ·Î±×·¥ ¿¡·¯" ½Ã±×³¯ÀÌ ¹ß»ýÇϸé, Á÷Á¢ ÀûÀ¸·Î ¿¡·¯¿¡ ±âÀÎÇÏ´Â ½Ã±×³¯·Î½á ÄÚ¾Æ ´ýÇÁ ÆÄÀÏÀ» ¸¸µç´Ù.
21.2 Ç¥ÁØ ½Ã±×³¯µé.
ÀÌ ÀýÀº ´Ù¾çÇÑ Ç¥ÁØ ½Ã±×³¯µéÀÇ À̸§°ú ±×°ÍÀÌ ¾î¶² »ç°ÇÀ» ÀǹÌÇϰí ÀÖ´ÂÁö¸¦ ¼³¸íÇϰí ÀÖ´Ù. °¢°¢ÀÇ ½Ã±×³¯ÀÇ À̸§Àº ½Ã±×³¯ÀÇ Á¾·ù¸¦ À§ÇÑ ½Ã±×³¯¹øÈ£·Î½á ¾çÀÇ Á¤¼ö·Î ³ªÅ¸³½ ¸ÅÅ©·ÎÀÌ´Ù. ´ç ½ÅÀº ¿©±â¿¡¼ Á¤ÀÇÇÑ À̸§´ë½Å¿¡ ´ç½Å ¸¶À½´ë·Î ½Ã±×³¯ÀÇ ¹øÈ£Äڵ带 °áÄÚ °¡Á¤ÇÒ ¼ö ¾ø´Ù.
À̰ÍÀº ½Ã±×³¯ÀÇ Á¾·ù¿¡ ºÎ¿©µÈ ¹øÈ£°¡ ½Ã½ºÅÛ¿¡¼ ½Ã½ºÅÛÀ¸·Î´Â ¹Ù²Ü¼ö ÀÖÁö¸¸, ±× À̸§µéÀÇ ÀÇ¹Ì ´Â Ç¥ÁØÈµÇ¾îÀÖ°í ¿ÏÀüÈ÷ ´ÜÀÏÈ µÇ¾îÀֱ⠶§¹® ÀÌ´Ù. ½Ã±×³¯ÀÇ À̸§µéÀº Çì´õÆÄÀÏ `signal.h'¿¡ Á¤ÀǵǾî ÀÖ´Ù.
¸ÅÅ©·Î : int NSIG
ÀÌ ½Éº¼ »ó¼öÀÇ °ªÀº Á¤ÀÇµÈ ½Ã±×³¯ÀÇ ÃÑ °³¼öÀÌ´Ù. ½Ã±×³¯ÀÇ ¹øÈ£µéÀº ¿¬¼ÓÀûÀ¸·Î ÇÒ´çµÇ¾î Àֱ⠶§¹®¿¡ NSIG´Â Á¤ÀÇµÈ ½Ã±×³¯ÀÇ ¹øÈ£Áß¿¡¼ °¡Àå Å« ¹øÈ£º¸´Ù Çϳª°¡ Å©´Ù.
21.2.1 ÇÁ·Î±×·¥ ¿¡·¯ ½Ã±×³¯µé.
´ÙÀ½ÀÇ ½Ã±×³¯µéÀº ½É°¢ÇÑ ÇÁ·Î±×·¥ÀÇ ¿¡·¯°¡ ¿î¿µÃ¼Á¦³ª ÄÄÇ»ÅÍ ÀÚü¿¡ ÀÇÇØ °ËÃâµÇ¾úÀ» ¶§ ¹ß»ý µÈ´Ù. ÀϹÝÀûÀ¸·Î, ÀÌµé ½Ã±×³¯ ¸ðµÎ´Â ´ç½ÅÀÇ ÇÁ·Î±×·¥ÀÌ ½É°¢ÇÏ°Ô ±úÁ®ÀÖ°í, ¿¡·¯°¡ Æ÷ÇÔµÈ ±× ½Ç ÇàÀ» °è¼ÓÇÒ ¾Æ¹«·± ¹æ¹ýÀÌ ¾øÀ½À» ÁöÀûÇÑ´Ù.
¾î¶² ÇÁ·Î±×·¥µéÀº ÇÁ·Î±×·¥ÀÇ ¿¡·¯ ½Ã±×³¯·Î ÀÎÇØ¼ Á¾·áµÇ±â Àü¿¡ ±×µéÀ» ±ú²ýÇÏ°Ô Ã³¸®ÇÑ´Ù; ¿¹ ¸¦µé¾î, Å͹̳¯ ÀÔ·ÂÀÇ ¹ÝÇâÀ» ²ö(tnun off) ÇÁ·Î±×·¥µéÀº ´Ù½Ã ¹ÝÇâÀ» ÄÓ ¸ñÀûÀ¸·Î ÇÁ·Î±×·¥ ¿¡·¯ ½Ã±×³¯µéÀ» ó¸®ÇÒ °ÍÀÌ´Ù. Çڵ鷯´Â ½Ã±×³¯À» À§ÇÑ µðÆúÆ® µ¿ÀÛÀ» Á¤ÇÏ°í ±× µ¿ÀÛÀ» ÇÔÀ¸·Î½á ³¡ ³¯ °ÍÀÌ´Ù; ¸¸ÀÏ ÇÁ·Î±×·¥ÀÌ ½Ã±×³¯ Çڵ鷯¸¦ °¡ÁöÁö ¾Ê¾Ò´Ù¸é, ÇÁ·Î±×·¥Àº ±× ½Ã±×³¯·Î ÀÎÇØ¼ Á¾ ·áµÉ °ÍÀÌ´Ù. ( 21.4.2Àý [Termination in Handler] 286 ÆäÀÌÁö ÂüÁ¶.)
Á¾·á´Â ´ëºÎºÐÀÇ ÇÁ·Î±×·¥¿¡ ¿¡¼ ¿¡·¯¿¡ ´ëÀÀÇÑ ÀÌÇØ°¡´ÉÇÑ ÃÖÁ¾ÀûÀÎ °á°úÀÌ´Ù. ±×·¸Áö¸¸, Lisp°ú °°Àº ÇÁ·Î±×·¡¹Ö½Ã½ºÅÛµéÀº »ç¿ëÀÚ ÇÁ·Î±×·¥¿¡ ¿¡·¯°¡ ¹ß»ýÇßÀ»Áö¶óµµ ÄÄÆÄÀÏµÈ »ç¿ëÀÚ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄѾßÇÒ Çʿ䰡 ÀÖ´Ù¸é ·Îµå(load)½Ãų ¼ö ÀÖ´Ù. À̵é ÇÁ·Î±×·¥Àº Ä¿¸àµå ·¹º§(command level)·Î Á¦¾î¸¦ ¸®ÅÏÇÏ´Â longjmp¸¦ »ç¿ëÇÑ Çڵ鷯¸¦ °®´Â´Ù. ¸ðµç ½Ã±×³¯ÀÇ µðÆúÆ® µ¿ÀÛÀº ÇÁ·Î¼¼ ½º¸¦ Á¾·áÇÏ´Â °ÍÀÌ´Ù. ¸¸ÀÏ ´ç½ÅÀÌ ±× ½Ã±×³¯µéÀ» ºí·ÏÇϰųª ¹«½ÃÇϰųª ½Ã±×³¯À» À§ÇÑ Çڵ鷯¸¦ ¸¸µç´Ù¸é, ´ç½ÅÀÇ ÇÁ·Î±×·¥Àº ¾Æ¸¶µµ ±×¿Í °°Àº ½Ã±×³¯µéÀÌ ¹ß»ýÇßÀ» ¶§, ±×µéÀÌ ½ÇÁ¦ ¿¡·¯´ë½Å¿¡ raise³ª kill¿¡ ÀÇÇØ ¹ß»ýµÈ °ÍÀÌ ¾Æ´Ï¶ó¸é, ½É°¢ÇÏ°Ô ÆÄ±«µÉ °ÍÀÌ´Ù.
±×µé ÇÁ·Î±×·¥ ¿¡·¯ ½Ã±×³¯ÁßÀÇ Çϳª°¡ ÇÁ·Î¼¼½º¸¦ Á¾·áÇÒ ¶§, Á¾·á¿Í °°Àº ½Ã°£¿¡ ÇÁ·Î¼¼½ºÀÇ »ó Ȳ±â·ÏÀ» ÄھƴýÇÁÆÄÀÏ¿¡ Ãâ·ÂÇÑ´Ù. ÄھƴýÇÁ ÆÄÀÏÀº `core'¶ó°í À̸§Áö¾îÁ³°í ÇÁ·Î¼¼½º°¡ ÇöÀç Á¸ ÀçÇϰí ÀÖ´Â µð·ºÅ丮 ¿¡ Á¸ÀçÇÑ´Ù. ( GNU ½Ã½ºÅÛ¿¡¼, ´ç½ÅÀº ȯ°æº¯¼ö COREFILE¸¦ ÅëÇØ¼ ÄÚ¾Æ ´ýÇÁÆÄÀÏÀÇ À̸§À» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.) ÄھƴýÇÁÆÄÀÏÀÇ Á¸Àç ¸ñÀûÀº ¹«½¼ ¿¡·¯°¡ ¹ß»ýÇß´ÂÁö Á¶»çÇÏ ±â À§ÇÔÀ¸·Î½á, µð¹ö°Å¸¦ »ç¿ëÇØ¼ ±×µéÀ» ½ÃÇèÇÒ ¼ö ÀÖ´Ù.
¸ÅÅ©·Î : int SIGFPE
SIGFPE ½Ã±×³¯Àº ½É°¢ÇÑ »ê¼úÀû ¿¡·¯¸¦ º¸°íÇÑ´Ù. ±× À̸§ÀÌ "floating-point exception"¿¡¼ À¯·¡ µÈ°ÍÀ̶ó ÇÒÁö¶óµµ, ÀÌ ½Ã±×³¯Àº ½ÇÁ¦·Î´Â ¸ðµç »ê¼úÀû ¿¡·¯µé¿¡ ÀÛ¿ëÇÑ´Ù. ¸¸ÀÏ ¾î¶² ÇÁ·Î±×·¥ÀÌ ¾î¶² À§Ä¡¿¡ Á¤¼ö µ¥ÀÌÅ͸¦ ÀúÀåÇÏ°í ±× µ¥ÀÌÅÍ¿¡ ÇÃ·ÎÆÃ-Æ÷ÀÎÆ® ¸í·ÉÀ» »ç¿ëÇÑ´Ù¸é, À̰ÍÀº ±× ÇÁ ·Î¼¼¼°¡ µ¥ÀÌÅ͸¦ ÇÃ·ÎÆÃ-Æ÷ÀÎÆ® ¼ö·Î½á ÀνÄÇÒ ¼ö ¾ø±â ¶§¹®¿¡ Á¾Á¾ "À¯¿ëÇÏÁö ¾ÊÀº ¿¬»ê"ÀÇ ¿øÀÎ ÀÌ µÈ´Ù.
ÇÃ·ÎÆÃ-Æ÷ÀÎÆ® ¿¹¿Ü»óȲ¿¡ ´ëÇÑ °ÍÀº ¾ÆÁÖ ¹Î°¨ÇÏ°Ô ´Ù¸¥ Àǹ̸¦ Áö´Ñ ¿¹¿Ü»óȲÀÇ ¿©·¯Á¾·ùµéÀÌ Àֱ⠶§¹®¿¡ ¾ÆÁÖ º¹ÀâÇÑ ÁÖÁ¦À̰í, SIGFPE ½Ã±×³¯Àº ±×µéÀ» ±¸ºÐÇÏÁö ¾Ê´Â´Ù. ÀÌÁø ÇÃ·ÎÆÃ-Æ÷ÀÎ Æ® ¿¬»êÀ» À§ÇÑ IEEE Ç¥ÁØ(ANSI/IEEE Std 754-1985)Àº ´Ù¾çÇÑ ÇÃ·ÎÆÃ-Æ÷ÀÎÆ® ¿¹¿Ü»óȲ¿¡ ´ëÇØ¼ Á¤ÀÇÇϰí ÀÖ°í ÄÄÇ»ÅÍ ½Ã½ºÅÛÀÌ ¿¹¿Ü»óȲÀÇ ¹ß»ýÀ» º¸°íÇÒ ¶§ µû¸£µµ·Ï ¿ä±¸ÇÑ´Ù. ±×·¸Áö¸¸, ÀÌ Ç¥ ÁØÀº ±× ¿¹¿Ü»óȲÀÌ ¾î¶»°Ô º¸°íµÇ´Â Áö¿¡ ´ëÇØ¼´Â ÁöÁ¤ÇÏÁö ¾Ê¾Ò°í, ¶ÇÇÑ ¿î¿µÃ¼Á¦°¡ Á¦¾î¿Í ó¸® ÀÇ ¾î¶² Á¾·ù¸¦ ÇÁ·Î±×·¡¸Ó¿¡°Ô Á¦°øÇÒ ¼ö ÀÖ´ÂÁö¸¦ ÁöÁ¤ÇÏÁö ¾Ê¾Ò´Ù.
BSD ½Ã½ºÅÛµéÀº ¿¹¿Ü»óȲÀÇ ´Ù¾çÇÑ ¿øÀÎÀ» ±¸º°Çϴ Ưº°ÇÑ Àμö¸¦ °¡Áø SIGFPE Çڵ鷯¸¦ Á¦°ø ÇÑ´Ù. ÀÌ Àμö¸¦ ¾ï¼¼½º Çϱâ À§Çؼ, ´ç½ÅÀº µÎ °³ÀÇ Àμö¸¦ ¹Þ¾ÆµéÀÌ´Â Çڵ鷯¸¦ Á¤ÀÇÇØ¾ß¸¸ ÇÑ ´Ù. GNU ¶óÀ̺귯¸®´Â ÀÌ Æ¯º°ÇÑ Àμö¸¦ Á¦°øÇÏÁö¸¸, ±× °ªÀº BSD ½Ã½ºÅÛ°ú GNU ½Ã½ºÅÛ¿¡¼¸¸ ¿ÀÁ÷ Àǹ̰¡ ÀÖ´Ù.
¿ªÀÚÁÖ : trap(Æ®·¦) : ÇϳªÀÇ ¸í·É¾î°¡ ½ÇÇàµÉ µû¸¶´Ù ÀÚµ¿ÀûÀ¸·Î ¹ß»ýµÇ´Â ÀÎÅÍ·´Æ®. ÀÌ·¯ÇÑ ÀÎ ÅÍ·´Æ®´Â Áß¾Óó¸® ÀåÄ¡¿¡ ÀÇÇÏ¿© Çϵå¿þ¾î ÀûÀ¸·Î ¹ß»ýÇÏ°Ô µÇ´Âµ¥ ÇÁ·Î±×·¥¿¡¼ ÇϳªÀÇ ¸í·É¾î°¡ ½ÇÇàµÉ ¶§¸¶´Ù ÀÚµ¿ÀûÀ¸·Î ¹Ì¸® Á¤ÀÇµÈ Æ®·¦ ó¸® ·çƾÀ¸·Î ½ÇÇàÀÇ Á¦¾î±ÇÀÌ ³Ñ¾î¿Â´Ù. Çϵå¿þ¾î ÀåÄ¡¿Í ¹ÐÁ¢ÇÑ °ü·ÃÀÌ ÀÖ´Â ½Ã½ºÅÛ ¼ÒÇÁÆ® ¿þ¾î¿¡¼ ¿À·ù¸¦ ã¾Æ³»±â À§ÇÑ ¼ö´ÜÀ¸·Î ÀÌ¿ëµÈ´Ù.
FPE_INTOVF_TRAP
Á¤¼ö ¿À¹öÇ÷οì ( ´ç½ÅÀÌ Çϵå¿þ¾îÀÇ Á¤ÇØÁø »ç¾ç¿¡ µû¶ó¼ ¿À¹öÇ÷οìÀÇ Æ®·¦ÀÌ °¡´ÉÇÏÁö ¾ÊÀ¸¸é C ÇÁ·Î±×·¥¿¡¼´Â ºÒ°¡´ÉÇÏ´Ù. )
FPE_INTDIV_TRAP
Á¤¼ö¸¦ 0À¸·Î ³ª´©±â.
FPE_SUBRNG_TRAP
¾Æ·¡¿¡ ±âÀÔÇÑ-¹üÀ§ ( ¾î¶² C ÇÁ·Î±×·¥Àº °áÄÚ Ã¼Å©ÇÏÁö ¾Ê´Â´Ù. )
FPE_FLTOVF_TRAP
ÇÃ·ÎÆÃ ¿À¹öÇÃ·Î¿ì Æ®·¦.
FPE_FLTDIV_TRAP
ÇÃ·ÎÆÃ/Á¤¼ö¸¦ 0À¸·Î ³ª´®.
FPE_FLTUND_TRAP
ÇÃ·ÎÆÃ ¾ð´õÇ÷οì. Æ®·¦ ( ÇÃ·ÎÆÃ Æ÷ÀÎÆ®¿¡¼ Æ®·¦ÇÏ´Â °ÍÀº º¸Åë °¡´ÉÇÏÁö ¾Ê´Ù.)
FPE_DECOVF_TRAP
½ÊÁø¼ö ¿À¹öÇÃ·Î¿ì Æ®·¦. ( ¿ÀÁ÷ ¸î °³ÀÇ ±â°è¿¡¼¸¸ ½ÊÁø¼ö ¿¬»êÀ» °®°í ÀÖ°í C¿¡¼´Â °áÄÚ ±×°ÍÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù. )
¸ÅÅ©·Î : int SIGILL
ÀÌ ½Ã±×³¯ÀÇ À̸§Àº "illegal instruction : ºñÇÕ¹ýÀûÀÎ ¸í·É"¿¡¼ À¯·¡µÇ¾ú´Ù; ±×°ÍÀº ¾µ¸ð¾ø°Å³ª Ư±Ç ÀÌ ºÎ¿©µÈ ¸í·É¾î¸¦ ½ÇÇàÇÏ·Á Çß´Ù´Â ÀǹÌÀÌ´Ù. ¿ÀÁ÷ À¯¿ëÇÑ ¸í·É¾î¸¸ÀÌ ¹ß»ýµÈ C ÄÄÆÄÀÏ·¯¿¡¼, SIGILLÀº ÀüÇüÀûÀ¸·Î ½ÇÇà °¡´É ÆÄÀÏÀÌ ÈѼյǾú°Å³ª, ´ç½ÅÀÌ µ¥ÀÌÅ͸¦ ½ÇÇàÇÏ·Á ½ÃµµÇß´Ù´Â °ÍÀ» ÁöÀûÇÑ´Ù. ÈÄÀÚÀÇ »óȲÀÌ ¹ß»ýµÇ´Â ÀϹÝÀû »óȲÀ¸·Î´Â ÇÔ¼ö¸¦ À§ÇÑ Æ÷ÀÎÅͰ¡ ÀÖÀ» °ÍÀ̶ó°í ¿¹»óµÈ °÷¿¡¼ À¯¿ëÇÏÁö ¾ÊÀº ¿ÀºêÁ§Æ®¸¦ ÆÄ½ÌÇϰųª, ÀÚµ¿ ¹è¿ÀÇ ³¡À» ³Ñ¾î¼ ±â·ÏÀ» Çϰí( ¶Ç´Â ÀÚµ¿ º¯ ¼ö¸¦ À§ÇÑ Æ÷ÀÎÅÍ¿Í À¯»çÇѹ®Á¦µé) ½ºÅØ ÇÁ·¹ÀÓÀÇ ¸®ÅÏ ¾îµå·¹½º ó·³ ½ºÅØ¿¡¼ ´Ù¸¥ µ¥ÀÌÅÍÀÇ ÈÑ ¼Õ°ú °°Àº ¹®Á¦µéÀÌ ÀÖ´Ù.
¸ÅÅ©·Î : int SIGSEGV
ÀÌ ½Ã±×³¯Àº ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ ¹üÀ§¸¦ ¹þ¾î³ª´Â°÷¿¡¼ Àаųª, ¾²±â¸¦ ½ÃµµÇÒ ¶§ ¹ß»ýµÈ´Ù. ( ½ÇÁ¦·Î, ±× ½Ã±×³¯µéÀº ÇÁ·Î±×·¥ÀÌ ÃæºÐÇÑ ¿µ¿ªÀ» ÇÒ´ç¹ÞÁö ¸øÇÒ ¶§ ½Ã½ºÅÛ ¸Þ¸ð¸® º¸È£ ¸ÞÄ«´ÏÁò¿¡ ÀÇÇØ¼ ¹ß»ýÇÑ´Ù.) ±× À̸§Àº "segmentation violation"ÀÇ ¾àÀÚÀÌ´Ù. SIGSEGV »óȲÀÌ ¹ß»ýµÇ´Â °¡Àå ÀÏ¹Ý ÀûÀÎ ¹æ¹ýÀº ºñÂüÁ¶µÇ´Â ³Î( defeferencing a null) À̳ª ÃʱâȵÇÁö ¾ÊÀº Æ÷ÀÎÅÍ¿¡ ÀÇÇÑ °ÍÀÌ´Ù. ³Î Æ÷ÀÎÅÍ´Â ÁÖ¼Ò 0À¸·Î ÂüÁ¶µÇ°í, ´ëºÎºÐÀÇ ¿î¿µÃ¼Á¦´Â ÀÌ ÁÖ¼Ò°¡ Á¤È®ÇÏ°Ô À¯¿ëÇÏÁö ¾ÊÀ½À» È®½ÇÈ÷ÇÏ ±â ¶§¹®¿¡ ºñÂüÁ¶ ³Î Æ÷ÀÎÅÍ´Â SIGSEGV°¡ ¹ß»ýµÉ °ÍÀÌ´Ù. (¾î¶² ¿î¿µÃ¼Á¦´Â ÁÖ¼Ò°¡ 0ÀÎ ¸Þ¸ð¸®µµ À¯¿ëÇϰí, ºñÂüÁ¶ ³Î Æ÷ÀÎÅÍ´Â ±×µé ½Ã½ºÅÛ »ó¿¡¼´Â ½Ã±×³¯À» ¹ß»ýÇÏÁö ¾Ê´Â´Ù.) ºñÃʱâÈµÈ Æ÷ÀÎ ÅÍ¿¡¼´Â, À¯¿ëÇÏÁö ¾Ê°Å³ª, À¯¿ëÇÏ´õ¶óµµ ÀÓÀÇÀÇ ÁÖ¼ÒµéÀ» °®°ÔµÈ´Ù. SIGSEGV »óȲÀÌ ¾ò¾îÁö´Â ´Ù ¸¥ ÀϹÝÀû ¹æ¹ýÀº ¹è¿¿¡ Æ÷ÀÎÅ͸¦ »ç¿ëÇßÀ» ¶§ ±× ¹è¿ÀÇ ³¡À» üũÇϱ⸦ ½ÇÆÐÇßÀ»¶§ÀÌ´Ù.
¸ÅÅ©·Î : int SIGBUS
ÀÌ ½Ã±×³¯Àº À¯¿ëÇÏÁö ¾ÊÀº Æ÷ÀÎÅͰ¡ ºñÂüÁ¶µÇ¾úÀ» ¶§ ¹ß»ýµÈ´Ù. SIGSEGV ó·³, ÀÌ ½Ã±×³¯Àº Ãʱâ ȵÇÁö ¾ÊÀº Æ÷ÀÎÅ͸¦ ºñÂüÁ¶ ÇѰÍÀÇ °á°úÀÌ´Ù. µÎ ½Ã±×³¯ÀÇ Â÷ÀÌÁ¡Àº SIGSEGV´Â À¯¿ëÇÑ ¸Þ¸ð¸® ¿¡¼ À¯¿ëÇÏÁö ¸øÇÑ ¾ï¼¼½º¸¦ ÁöÀûÇϰí, SIGBUS´Â À¯¿ëÇÏÁö¸øÇÑ ÁÖ¼Ò¸¦ ¾ï¼¼½º ÇÏ´Â °ÍÀ» ÁöÀûÇÑ ´Ù. Ưº°ÇϰÔ, SIGBUS ½Ã±×³¯Àº 4°³·Î ³ª´©¾îÁöÁö ¾ÊÀº ÁÖ¼Ò¿¡ 4-´Ü¾î Á¤¼ö·Î ÂüÁ¶Çϴ°Íó·³, ºÎ Àû´çÇÑ Æ÷ÀÎÅͰ¡ ºñÂüÁ¶µÊÀ¸·Î½á ¹ß»ýÇÑ´Ù. ( °¢Á¾ ½Ã½ºÅÛÀº ÁÖ¼Ò Á¤·ÄÀº À§ÇÑ ÀڽŸ¸ÀÇ ÇÊ¿äÁ¶°ÇÀ» °®´Â´Ù.) ÀÌ ½Ã±×³¯ÀÇ À̸§Àº "bus error"ÀÇ ¾àÀÚÀÌ´Ù.
¸ÅÅ©·Î : int SIGABRT
ÀÌ ½Ã±×³¯Àº ÇÁ·Î±×·¥ ±× ÀÚü¿Í abort°¡ È£ÃâµÇ¾úÀ½À» º¸°íÇÔÀ¸·Î½á ¹ß»ýµÇ´Â ¿¡·¯¸¦ ÁöÀûÇÑ´Ù. 22.3.4Àý [Aborting a Program] 322 ÆäÀÌÁö ÂüÁ¶.
21.2.2 Á¾·á ½Ã±×³¯.
ÀÌµé ½Ã±×³¯µéÀº ÀÌ·± Àú·± ¹æ¹ýÀ¸·Î ÇÁ·Î¼¼½º¸¦ Á¾·áÇÔÀ» ¾Ë¸®±âÀ§ÇØ »ç¿ëµÈ´Ù. ±×µéÀº ¿ÏÀüÈ÷ ´Ù¸¥ ¸ñÀûÀ» À§ÇØ »ç¿ëµÇ±â ¶§¹®¿¡ ´Ù¸¥ À̸§À» °¡Á³°í, ÇÁ·Î±×·¥Àº ±×µéÀº ´Ù¸£°Ô Ãë±ÞÇϱ⸦ ¿øÇÒ °ÍÀÌ´Ù.
ÀÌµé ½Ã±×³¯µéÀº ó¸®Çϱâ À§ÇÑ ÀÌÀ¯´Â º¸Åë ´ç½ÅÀÇ ÇÁ·Î±×·¥ÀÌ ½ÇÁ¦·Î Á¾·áµÇ±âÀü¿¡ Àû´çÇÏ°Ô Ã³ ¸®ÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§ÇÑ °ÍÀÌ´Ù. ¿¹¸¦µé¾î, ´ç½ÅÀº »óȲÁ¤º¸¸¦ ÀúÀåÇϰí, Àӽà ÆÄÀϵéÀ» Áö¿ì°í, ÀÌÀüÀÇ Å͹̳¯ ¸ðµå¸¦ ¹ÝȯÇϱ⸦ ¿øÇÒ¼öµµ ÀÖ´Ù. ±×¿Í°°ÀÌ Çڵ鷯(handler)´Â ¹ß»ýµÈ ½Ã±×³¯À» À§ ÇÑ µðÆúÆ® µ¿ÀÛÀ» ÁöÁ¤ÇÏ°í ±×¸®°í ±× ½Ã±×³¯À» ´Ù½Ã ¹ß»ý½ÃÅ´À¸·Î½á Á¾·áÇÒ °ÍÀÌ´Ù; À̰ÍÀº ¸¸ÀÏ ÇÁ·Î±×·¥ÀÌ Çڵ鷯¸¦ °¡ÁöÁö ¾Ê¾Ò´õ¶óµµ, ±× ½Ã±×³¯·Î ÀÎÇØ¼ ÇÁ·Î±×·¥ÀÌ Á¾·áµÉ °ÍÀÌ´Ù. ( 21.4.2Àý [Termination in Handler] 286 ÆäÀÌÁö ÂüÁ¶.)
ÀÌ ½Ã±×³¯µéÀ» À§ÇÑ (¸í¹éÇÑ) µðÆúÆ® µ¿ÀÛÀº ÇÁ·Î¼¼½º°¡ Á¾·áµÇµµ·Ï ÇÏ´Â °ÍÀÌ´Ù.
¸ÅÅ©·Î : int SIGHUP
SIGHUP ("hang-up") ½Ã±×³¯Àº »ç¿ëÀÚ Å͹̳¯ÀÇ ´ÜÀýÀ» º¸°íÇϱâ À§ÇØ »ç¿ëµÇ¾îÁö´Âµ¥, ¾Æ¸¶µµ ³× Æ®¿÷À̳ª Àüȼ± ¿¬°áÀÌ ²÷¾îÁ³±â ¶§¹®ÀÌ´Ù. À̰Ϳ¡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸´Â 12.4.6Àý [Control Modes] 191 ÆäÀÌÁö ÂüÁ¶. ÀÌ ½Ã±×³¯Àº ¶ÇÇÑ ±× ¼¼¼Ç°ú ¿¬°üµÈ ÀÛ¾÷À» À§Çؼ Å͹̳¯¿¡¼ Á¦¾îÇϰí ÀÖ´Â ÇÁ ·Î¼¼½ºÀÇ Á¾·á¸¦ º¸°íÇϱâ À§ÇØ »ç¿ëµÇ¾îÁø´Ù; ÀÌ Á¾·á´Â Á¦¾îÁßÀÎ Å͹̳¯·ÎºÎÅÍ ±× ¼¼¼Ç¾È¿¡ ÀÖ´Â ¸ðµç ÇÁ·Î¼¼½º¸¦ È¿°úÀûÀ¸·Î ´ÜÀýÇÑ´Ù. ´õ »ó¼¼ÇÑ Á¤º¸´Â 22.3.5Àý [Termination Internals] 322 Æä ÀÌÁö ÂüÁ¶.
¸ÅÅ©·Î : int SIGINT
SIGINT("program interrupt") ½Ã±×³¯Àº »ç¿ëÀÚ°¡ INTR ¹®ÀÚ¸¦ (º¸Åë C-c)¸¦ ŸÀÔÇßÀ» ¶§ º¸³»¾îÁø ´Ù. Å͹̳¯ µå¶óÀ̹ö°¡ C-c ¸¦ Áö¿øÇÏ´ÂÁö¿¡ ´ëÇÑ Á¤º¸´Â 12.4.9Àý [Special Characters] 195 ÆäÀÌÁö ÂüÁ¶.
¸ÅÅ©·Î : int SIGQUIT
SIGQUIT ½Ã±×³¯Àº ´Ù¸¥ Ű_QUIT ¹®ÀÚ, º¸Åë C-\_¿¡ ÀÇÇØ¼ Á¦¾îµÈ´Ù´Â °ÍÀ» Á¦¿ÜÇϰí´Â SIGINT ¿Í À¯»çÇϰí, ±× ÇÁ·Î¼¼½º°¡ Á¾·á µÉ ¶§ ÇÁ·Î±×·¥ ¿¡·¯ ½Ã±×³¯Ã³·³ ÄھƴýÇÁ ÆÄÀÏÀ» ÀÛ¼ºÇÑ´Ù. ´ç½Å Àº »ç¿ëÀÚ¿¡ ÀÇÇØ "°ËÃâµÈ" ÇÁ·Î±×·¥ ¿¡·¯ »óȲÀ¸·Î À̵éÀ» »ý°¢ÇÒ ¼ö ÀÖ´Ù. ÄÚ¾Æ ´ýÇÁ ÆÄÀÏ¿¡ ´ëÇÑ Á¤º¸´Â 21.2.1Àý [Program Erroe Signals] 273 ÆäÀÌÁö ÂüÁ¶. Áö¿øÇÏ´Â Å͹̳¯ µå¶óÀ̹ö¿¡ ´ëÇÑ Á¤º¸ ´Â 12.4.9Àý [Special Characters] 195 ÆäÀÌÁö ÂüÁ¶. ¼Ò°ÅÀÇ ¾î¶² Á¾·ùµéÀº SIGQUIT¸¦ ó¸®ÇÏ´Â µ¿ ¾È¿¡ »ý·«µÇ¾îÁö´Â °ÍÀÌ ÁÁ´Ù. ¿¹¸¦µé¾î, ¸¸ÀÏ ÇÁ·Î±×·¥ÀÌ ÀÓ½ÃÆÄÀÏÀ» ¸¸µç´Ù¸é, ±×°ÍÀº ÀÓ½ÃÆÄÀÏÀ» Áö¿òÀ¸·Î½á ´Ù¸¥ Á¾·á ¿äûÀ» ó¸®ÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ »ç¿ëÀÚ°¡ ÄÚ¾Æ ´ýÇÁ ÆÄÀÏÀ» ½ÃÇèÇÒ¼ö ÀÖ°Ô ÇÏ ±â À§ÇÏ¿©, ±×µéÀ» Áö¿ìÁö ¾Ê´Â °ÍÀÌ SIGQUIT¸¦ À§Çؼ ´õ ÁÁ´Ù.
¸ÅÅ©·Î : int SIGTERM
SIGTERM ½Ã±×³¯Àº ÇÁ·Î±×·¥À» Á¾·áÇϴµ¥ »ç¿ëÇÏ´Â Æ÷°ýÀûÀÎ ½Ã±×³¯ÀÌ´Ù. SIGKILL°ú ´Þ¸®, ÀÌ ½ÅÈ£´Â ºí·ÏµÇ¾îÁø°í, 󸮵ǾîÁö°í ¹«½ÃµÇ¾îÁú ¼ö ÀÖ´Ù. ½© Äڸǵå killÀº µðÆúÆ®·Î SIGTERMÀ» ¹ß»ý½ÃŲ´Ù.
¸ÅÅ©·Î : int SIGKILL
SIGKILL ½Ã±×³¯Àº Áï°¢ÀûÀÎ ÇÁ·Î±×·¥ Á¾·á¸¦ ÀÏÀ¸Å°±â À§Çؼ »ç¿ëµÇ¾îÁø´Ù. ÀÌ ½Ã±×³¯Àº ó¸®µÇ °Å³ª, ¹«½ÃµÇ°Å³ª ÇÒ ¼ö ¾ø°í, ±× °á°ú´Â Ç×»ó Ä¡¸íÀûÀÌ µÈ´Ù. ÀÌ ½Ã±×³¯Àº ºí·ÏÇϴ°͵µ ºÒ°¡´ÉÇÏ ´Ù.
ÀÌ ½Ã±×³¯Àº ¿ÀÁ÷ ¸í¹éÇÑ ¿äû¿¡ÀÇÇØ ¹ß»ýµÇ¾îÁø´Ù. ±×°ÍÀÌ Ã³¸®µÇ¾îÁú ¼ö ¾ø´Ù¸é, ´ç½ÅÀº ÀÏ´ÜC-c ¶Ç´Â SIGTERM°ú °°Àº ´ú °Ý·ÄÇÑ ¹æ¹ýÀ» ½ÃµµÇÑ ÈÄ¿¡, ³ªÁß¿¡ ¸¶Áö¸· ¹æ¹ýÀ¸·Î ¿ÀÁ÷ ±×°ÍÀ»¹ß»ý½Ã ų °ÍÀÌ´Ù. ¸¸ÀÏ ÇÁ·Î¼¼½º°¡ ¾î´À ´Ù¸¥ Á¾·á ½Ã±×³¯µé¿¡ ¹ÝÀÀÇÏÁö ¾Ê´Â´Ù¸é, SIGKILL½Ã±×³¯À» º¸ ³»¸é °ÅÀÇ Ç×»ó ±× ÇÁ·Î¼¼½º°¡ Á¾·áµÉ °ÍÀÌ´Ù. ½ÇÁ¦·Î, SIGKILLÀÌ ÇÁ·Î¼¼½º¸¦ Á¾·áÇϴµ¥ ½ÇÆÐÇÑ ´Ù¸é, ¿î¿µÃ¼Á¦ÀÇ ¹ö±× ¶§¹®ÀÌ´Ù.
12.2.3 ¾Ë¶÷ ½Ã±×³¯.
±×µé ½Ã±×³¯Àº ŸÀ̸ÓÀÇ °æ°ú¸¦ ÁöÀûÇϴµ¥ »ç¿ëµÇ¾îÁø´Ù. ÀÌµé ½Ã±×³¯À» º¸³»´Â ÇÔ¼ö¿¡ ´ëÇÑ Á¤ º¸´Â 17.3Àý [Settin an Alarm] 243 ÆäÀÌÁö ÂüÁ¶. ±×µé ½Ã±×³¯À» À§ÇÑ µðÆúÆ® µ¿ÀÛÀº ÇÁ·Î±×·¥À» Á¾ ·á¸¦ ÀÏÀ¸Å°´Â °ÍÀÌ´Ù. ÀÌ µðÆúÆ® µ¿ÀÛÀº °ÅÀÇ À¯¿ëÇÏÁö ¾Ê´Ù; ±×µé ½Ã±×³¯À» »ç¿ëÇÏ´Â ´ëºÎºÐÀÇ ¹æ ¹ýÀº ¾î´À °æ¿ì¿¡ ¸Â´Â Çڵ鷯 ÇÔ¼öµéÀ» ¿ä±¸ÇÏ´Â °ÍÀÌ´Ù.
¸ÅÅ©·Î : int SIGALRM
ÀÌ ½Ã±×³¯Àº ÀüÇüÀûÀ¸·Î ½ÇÁ¦¶Ç´Â Ŭ·° ½Ã°£À» °è»êÇÑ Å¸À̸ÓÀÇ °æ°ú¸¦ ÁöÀûÇÑ´Ù. ¿¹¸¦µé¾î alarm ÇÔ¼ö¿¡ÀÇÇØ »ç¿ëµÇ¾îÁø´Ù.
¸ÅÅ©·Î : int SIGVTALRM
ÀÌ ½Ã±×³¯Àº ÀüÇüÀûÀ¸·Î ÇöÀç ÇÁ·Î¼¼½º¿¡ ÀÇÇØ »ç¿ëµÈ CPU½Ã°£À» °è»êÇϴ ŸÀ̸ÓÀÇ °æ°ú¸¦ ÁöÀû ÇÑ´Ù. ±× À̸§Àº "virtual time alarm"ÀÇ ¾àÀÚÀÌ´Ù.
¸ÅÅ©·Î : int SIGPROF
ÀÌ ½Ã±×³¯Àº ÇöÀçÀÇ ÇÁ·Î¼¼½º¿¡ ÀÇÇØ »ç¿ëµÈ CPU ½Ã°£°ú, ÇÁ·Î¼¼½º¸¦ ´ë½ÅÇÏ¿© ½Ã½ºÅÛ¿¡ÀÇÇØ »ç¿ë µÈ CPU½Ã°£ÀÇ µÑÀ» °è»êÇÑ Å¸À̸ÓÀÇ °æ°ú¸¦ ÁöÀûÇϴµ¥ »ç¿ëµÈ´Ù. ŸÀ̸Ӱ¡ ÀÚ¿øÀÇ ÇÁ·ÎÆÄÀϸµÀ» À§ÇÑ µµ±¸·Î½á »ç¿ëµÇ¾îÁö¹Ç·Î, ½Ã±×³¯ÀÇ À̸§ÀÌ SIGPROFÀÌ´Ù.
¿ªÀÚÁÖ : profiling: ÇÁ·ÎÆÄÀϸµ : ½Ã½ºÅÛÀÇ ¼º´É ¹× º´¸ñÇö»óÀ» ¹æÁöÇϱâ À§ÇÑ µµ±¸¶ó°í »ý°¢ÇÏ ½Ã¸é µÉ °Í °°³×¿ä. Á¤È®ÇÏÁö°¡ ¾Ê¾Æ¼..
21.2.4 ºñµ¿±â ÀÔ/Ãâ·Â ½Ã±×³¯.
ÀÌ Àý¿¡ ¼³¸íµÈ ½Ã±×³¯µéÀº ºñµ¿±â ÀÔ/Ãâ·Â µµ±¸µé°ú ÇÔ²² »ç¿ëµÇ¾îÁø´Ù. ´ç½ÅÀº ¾î¶² ƯÁ¤ÇÑ ÆÄÀÏ ±â¼úÀÚ°¡ ±×µé ½Ã±×³¯À» ¹ß»ý½Ã۵µ·Ï Çϱâ À§Çؼ fcntlÀ» È£ÃâÇÔÀ¸·Î½á ¸í¹éÇÑ µ¿ÀÛÀ» ÃëÇϵµ·Ï ÇØ¾ßÇÑ´Ù( 8.12Àý[Interrupt Input] 120 ÆäÀÌÁö ÂüÁ¶.) ±×µé ½Ã±×³¯À» À§ÇÑ µðÆúÆ® µ¿ÀÛÀº ±×µéÀ» ¹« ½ÃÇÏ´Â °ÍÀÌ´Ù.
¸ÅÅ©·Î : int SIGIO
ÀÌ ½Ã±×³¯Àº ÆÄÀϱâ¼úÀÚ°¡ ÀÔ·Â ¶Ç´Â Ãâ·ÂÀ» ¼öÇàÇÒ Áغñ°¡ µÇ¾îÀÖÀ» ¶§ º¸³»¾îÁø´Ù. ´ëºÎºÐÀÇ ¿î ¿µÃ¼Á¦¿¡¼, Å͹̳¯°ú ¼ÒÄϸ¸ÀÌ SIGIO¸¦ ¹ß»ý½Ãų ¼ö ÀÖ´Ù; º¸ÅëÀÇ ÆÄÀϵéÀ» Æ÷ÇÔÇÑ ´Ù¸¥ Á¾·ùµéÀº ´ç½ÅÀÌ ±×µé¿¡°Ô ¿äûÇßÀ»Áö¶óµµ SIGIO½ÅÈ£¸¦ ¹ß»ý½ÃŰÁö ¾Ê´Â´Ù.
¸ÅÅ©·Î : int SIGURG
ÀÌ ½Ã±×³¯Àº ¼ÒÄÏ¿¡ µµÂøÇÑ µ¥ÀÌÅͰ¡ "±ä±Þ"Çϰųª ¹üÀ§¸¦ ¹þ¾î ³µÀ» ¶§ º¸³»¾îÁø´Ù. 11.8.8Àý [Out-of-Band Date] 173 ÆäÀÌÁö ÂüÁ¶.
21.2.5 ÀÛ¾÷ Á¦¾î ½Ã±×³¯.
ÀÌµé ½Ã±×³¯Àº ÀÛ¾÷ Á¦¾î¸¦ Áö¿øÇϱâ À§Çؼ »ç¿ëµÇ¾îÁø´Ù. ¸¸ÀÏ ´ç½ÅÀÇ ½Ã½ºÅÛÀÌ ÀÛ¾÷ Á¦¾î¸¦ Áö ¿øÇÏÁö ¾Ê´Â´Ù¸é ½Ã±×³¯µéÀº ¹ß»ýµÇ¾îÁö°Å³ª, ó¸®µÉ ¼ö´Â ¾øÁö¸¸ ¸ÅÅ©·ÎµéÀº Á¤ÀǵǾîÀÖ´Ù. ´ç½ÅÀÌ ½ÇÁ¦·Î ÀÛ¾÷ÀÌ ¾î¶»°Ô Á¦¾îµÇ´ÂÁö¸¦ ÀÌÇØÇÒ¼ö ¾ø´Ù¸é ±×µé ½Ã±×³¯À» ±×´ë·Î ¹æÄ¡ÇÒ °ÍÀÌ´Ù. 24Àå [Job Control] 335 ÆäÀÌÁö ÂüÁ¶.
¸ÅÅ©·Î : int SIGCHLD
ÀÌ ½Ã±×³¯Àº ÀÚ½Ä ÇÁ·Î¼¼½ºµéÁßÀÇ Çϳª¶óµµ Á¾·áµÇ°Å³ª ¸ØÃâ¶§¸¶´Ù ºÎ¸ð ÇÁ·Î¼¼½º¿¡°Ô º¸³»¾îÁø´Ù. ÀÌ ½Ã±×³¯À» À§ÇÑ µðÆúÆ® µ¿ÀÛÀº ±×°ÍÀ» ¹«½ÃÇÏ´Â °ÍÀÌ´Ù. ¸¸ÀÏ ´ç½ÅÀÌ wait ¶Ç´Â waitpid¸¦°ÅÃÄ (23.6Àý [Process Completion 329 ÆäÀÌÁö ÂüÁ¶.) ±×µéÀÇ »óȲÀÌ º¸°íµÇÁö ¾Ê¾ÒÁö¸¸, Á¾·áµÈ ÀÚ½Ä ÇÁ·Î ¼¼½º¿¡¼ ¹ß»ýÇÑ ½Ã±×³¯À» À§ÇÑ Çڵ鷯¸¦ ¸¸µç´Ù¸é, ´ç½ÅÀÇ »õ·Î¿î Çڵ鷯°¡ ±×µé ÇÁ·Î¼¼½º¿¡ Àû¿ë ÀÌ µÇ´øÁö ¶Ç´Â ƯÁ¤ÇÑ ¿î¿µÃ¼Á¦¿¡ ´Þ·ÁÀÖ´Ù.
¸ÅÅ©·Î : int SIGCONT
´ç½ÅÀº ÇÁ·Î¼¼½º°¡ °è¼ÓµÇµµ·Ï Çϱâ À§Çؼ SIGCONT ½ÅÈ£¸¦ º¸³¾ °ÍÀÌ´Ù. ÀÌ ½Ã±×³¯À» À§ÇÑ µðÆú Æ® µ¿ÀÛÀº ¸¸ÀÏ ±× ÇÁ·Î¼¼½º°¡ ¸ØÃß¾ú´Ù¸é ±× ÇÁ·Î¼¼½º¸¦ °è¼ÓÇϵµ·Ï ¸¸µå´Â °ÍÀÌ°í ±×·¸Áö¾Ê´Ù¸é ±×°ÍÀ» ¹«½ÃÇÏ´Â °ÍÀÌ´Ù. ´ëºÎºÐÀÇ ÇÁ·Î±×·¥¿¡¼´Â SIGCONT¸¦ ó¸®ÇÒ ¾Æ¹«·± ÀÌÀ¯°¡ ¾ø´Ù; ±×µé Àº Àü¿¡ ¸ØÃß¾ú¾úÀ½À» ÀνÄÇÔÀÌ ¾øÀÌ °è¼Ó ½ÇÇàµÇ°í ÀÖ´Ù°í °¡Á¤ÇÑ´Ù. ´ç½ÅÀº ¾î¶² ƯÁ¤ÇÑ µ¿ÀÛÀ» ÇÏ´Â ÇÁ·Î±×·¥À» ¸ØÃ߰ųª °è¼ÓÇϵµ·Ï ¸¸µé±â À§Çؼ SIGCONT ½Ã±×³¯À» À§ÇÑ Çڵ鷯¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù_¿¹¸¦µé¾î, ÀÔ·ÂÀ» ±â´Ù¸®±â À§Çؼ Àá½Ã ¸ØÃß¾úÀ» ¶§ ÇÁ·ÒÇÁÆ®¸¦ ´Ù½Ã ÇÁ¸°Æ® Çϴ°Ͱú °°Àº.
¸ÅÅ©·Î : int SIGSTOP
SIGSTOP ½Ã±×³¯Àº ÇÁ·Î¼¼½º¸¦ ¸ØÃá´Ù. ±×°ÍÀº 󸮵ǰųª, ¹«½ÃµÇ°Å³ª ºí·ÏµÉ ¼ö ¾ø´Ù.
¸ÅÅ©·Î : int SIGTSTP
SIGTSTP ½Ã±×³¯Àº »óÈ£ÀÛ¿ëÇÏ´Â ¸ØÃã ½ÅÈ£ÀÌ´Ù. SIGSTOP¿Í´Â ´Þ¸® ÀÌ ½ÅÈ£´Â 󸮵ǰųª ¹«½Ã µÇ¾îÁú ¼ö ÀÖ´Ù. ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡¼ ÇÁ·Î¼¼½º°¡ ¸ØÃß¾úÀ» ¶§ ÆÄÀÏÀ̳ª ½Ã½ºÅÛ Å×À̺íÀ» ¾ÈÀüÇÑ »óȲÀ¸·Î ¸¸µé¾î³õÀ» Ưº°ÇÑ Çʿ䰡 ÀÖ´Ù¸é ÀÌ ½ÅÈ£¸¦ ó¸®ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦µé¾î, ¹ÝÇâÀÌ ²¨Áø ÇÁ·Î ±×·¥¿¡¼´Â ¸ØÃß±â Àü¿¡ ´Ù½Ã ¹ÝÇâÀ» Äѵµ·Ï SIGTSTP ½Ã±×³¯À» ó¸®ÇÒ °ÍÀÌ´Ù. ÀÌ ½Ã±×³¯Àº »ç¿ë ÀÚ°¡ SUSP ¹®ÀÚ(º¸Åë C-z)¸¦ ŸÀÔÇßÀ» ¶§ ¹ß»ýµÈ´Ù. Áö¿øÇÏ´Â Å͹̳¯ µå¶óÀ̹ö¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤ º¸´Â 12.4.9Àý [Special Characters] 195 ÆäÀÌÁö ÂüÁ¶.
¸ÅÅ©·Î : int SIGTTIN
ÇÑ ÇÁ·Î¼¼½º°¡ ¹è°æ ÀÛ¾÷À¸·Î½á ½ÇÇàµÇ°í ÀÖ´Â µ¿¾È »ç¿ëÀÚÀÇ Å͹̳¯·ÎºÎÅÍ ÀÐÀ» ¼ö ¾ø´Ù. ¹è°æ ÀÛ ¾÷¿¡ ¼ÓÇÑ ¾î´À ÇÁ·Î¼¼½º°¡ Å͹̳¯·ÎºÎÅÍ ÀÐÀ¸·Á ½ÃµµÇÒ ¶§, ±× ÀÛ¾÷¿¡ ¼ÓÇÑ ¸ðµç ÇÁ·Î¼¼½º´Â SIGTTIN ½ÅÈ£¸¦ ¹Þ´Â´Ù. ÀÌ ½Ã±×³¯À» À§ÇÑ µðÆúÆ® µ¿ÀÛÀº ±× ÇÁ·Î¼¼½º¸¦ ¸ØÃß´Â °ÍÀÌ´Ù. ¾î¶»°Ô Å͹̳¯ µå¶óÀ̹ö¿Í »óÈ£ÀÛ¿ë ÇÏ´ÂÁö¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â 24.4Àý [Access to the Terminal] 336 Æä ÀÌÁö ÂüÁ¶.
¸ÅÅ©·Î : int SIGTTOU
SIGTTIN°ú À¯»çÇÏÁö¸¸, ¹è°æ ÀÛ¾÷¿¡ ¼ÓÇÑ ÇÁ·Î¼¼½º°¡ Å͹̳ο¡ Ãâ·ÂÇÏ·Á ½ÃµµÇϰųª ±× Å͹̳¯ ¸ð µå¸¦ ¼³Á¤ÇÏ·Á ½ÃµµÇÒ ¶§ ¹ß»ý µÈ´Ù. ´Ù½Ã ¸»ÇÏ¸é µðÆúÆ® µ¿ÀÛÀº ±× ÇÁ·Î¼¼½º¸¦ ¸ØÃß´Â °ÍÀÌ´Ù.
ÇÁ·Î¼¼½º°¡ ¸ØÃß¾îÀÖÀ» µ¿¾È, SIGKILL ½Ã±×³¯°ú SIGCONT½Ã±×³¯À» Á¦¿ÜÇϰí´Â ¾î´À ´Ù¸¥ ½Ã±×³¯ µéÀº ¹è´ÞµÇ¾îÁú ¼ö ¾ø´Ù. SIGKILL ½Ã±×³¯Àº Ç×»ó ÇÁ·Î¼¼½ºÀÇ Á¾·á¸¦ À¯¹ßÇÏ°í ºí·ÏµÇ°Å³ª ¹«½ÃµÉ ¼ö ¾ø´Ù. ´ç½ÅÀÌ SIGCONT ½Ã±×³¯À» ¹«½ÃÇϰųª ºí·ÏÇÒ ¼ö ÀÖÁö¸¸, ±×°ÍÀº ¸¸ÀÏ ±× ÇÁ·Î¼¼½º°¡ ¸Ø Ãß¾îÁ®ÀÖ´Ù¸é ÇÁ·Î¼¼½º°¡ °è¼ÓµÇµµ·Ï ÇÑ´Ù. ÇÁ·Î¼¼½º¿¡°Ô º¸³½ SIGCONT ½Ã±×³¯Àº ¾ÆÁ÷ ¹ÌÇØ°áÀΠä·Î ³²¾ÆÀÖ´Â ¸ØÃ㠽ñ׳¯À» ÇÁ·Î¼¼½º°¡ ¹ö¸®µµ·Ï ÇÑ´Ù. ÀÌ¿Í ºñ½ÁÇϰÔ, ¾î¶² ÇÁ·Î¼¼½º¿¡¼ ¾ÆÁ÷ ¹ÌÇØ°áÀÎä·Î ³²¾ÆÀÖ´Â SIGCONT ½Ã±×³¯Àº ¸ØÃ㠽ñ׳¯ÀÌ µµÂøÇßÀ» ¶§ ¹ö·ÁÁø´Ù.
°í¾Æ°¡ µÇ¾î¹ö¸° ÇÁ·Î¼¼½º ±×·ì¿¡ ÀÖ´Â ÇÑ ÇÁ·Î¼¼½º¿¡°Ô SIGTSTP, SIGTTIN, ¶Ç´Â SIGTTOU ½Ã ±×³¯Àº º¸³»¸é ±×°ÍÀº 󸮵ÇÁöµµ ¾Ê°í, ±× ÇÁ·Î¼¼½º´Â ¸ØÃß¾î ÁöÁöµµ ¾Ê´Â´Ù. ±×°ÍÀ» °è¼ÓÇÒ ¾Æ¹« ·± ¹æ¹ýÀÌ ¾ø´Â ºÎ´çÇÏ°Ô µÇ¾î¹ö¸° ÇÁ·Î¼¼½º¸¦ ¸ØÃß°Ô Ç϶ó. ¿î¿µÃ¼Á¦¿¡ ÀÇÁ¸ÇÏÁö ¸»°í´ç½ÅÀÌ ¹«¾ð °¡¸¦ »ç¿ëÇØ¼ ¸ØÃß°Ô Ç϶ó. ¾î¶² ½Ã½ºÅÛÀº ¾Æ¹«·± Àϵµ ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù; ´Ù¸¥ ½Ã½ºÅÛµéÀº ´ë½Å ¿¡ SIGKILL ¶Ç´Â SIGHUP¿Í °°Àº ½Ã±×³¯µéÀ» ¹è´ÞÇÒ °ÍÀÌ´Ù.
21.2.6 Àâ´ÙÇÑ ½Ã±×³¯.
±×µé ½Ã±×³¯Àº ´Ù¾çÇÑ ´Ù¸¥ »óȰµéÀ» º¸°íÇϱâ À§Çؼ »ç¿ëµÇ¾îÁø´Ù. À̵éÀÇ µðÆúÆ® µ¿ÀÛÀº ÇÁ·Î¼¼ ½º°¡ Á¾·áµÇµµ·Ï ÇÏ´Â °ÍÀÌ´Ù.
¸ÅÅ©·Î : int SIGPIPE
¸¸ÀÏ ´ç½ÅÀÌ ÆÄÀÌÇÁ³ª FIFOµéÀ» »ç¿ëÇÑ´Ù¸é, ´ç½ÅÀÇ ¾îÇø®ÄÉÀ̼ǿ¡¼ ´Ù¸¥ °ÍÀÌ Ãâ·ÂÀ» ½ÃÀÛÇϱâ Àü¿¡ ÇÑ ÇÁ·Î¼¼½º°¡ Àб⸦ À§Çؼ ÆÄÀÌÇÁ¸¦ °³¹æÇϵµ·Ï ¸¸µé¾î¾ß ÇÑ´Ù. ¸¸ÀÏ Àбâ ÇÁ·Î¼¼½º°¡ °á ÄÚ ½ÃÀÛµÇÁö ¾Ê°Å³ª, ±ÞÀÛ½º·´°Ô Á¾·áµÈ´Ù¸é ÆÄÀÌÇÁ³ª FIFO¿¡ Ãâ·ÂÇϱâ´Â SIGPIPE ½Ã±×³¯À» ¹ß»ý ½ÃŲ´Ù. ¸¸ÀÏ SIGPIPE °¡ ºí·ÏµÇ°Å³ª, 󸮵ǾîÁö°Å³ª, ¹«½ÃµÇ¾îÁö¸é, ±× ¼Õ»óµÈ È£ÃâÀº ´ë½Å¿¡ EPIPE·Î ½ÇÆÐÇÑ´Ù. ÆÄÀÌÇÁ¿Í FIFO Ưº°ÇÑ ÆÄÀϵéÀº 10Àå [Pipes and FIFOs] 145 ÆäÀÌÁö¿¡¼ Á»´õ ÀÚ¼¼ÇÏ°Ô ³íÀǵǾú´Ù. SIGPIPE°¡ ¹ß»ýÇÏ´Â ´Ù¸¥ ¿øÀÎÀº ´ç½ÅÀÌ ¿¬°áµÇÁö ¾ÊÀº ¼ÒÄÏ¿¡
Ãâ·ÂÀ» ½ÃµµÇßÀ» ¶§ ¹ß»ýÇÑ´Ù. 11.8.5.1Àý [Sending Data] 169 ÆäÀÌÁö ÂüÁ¶.
¸ÅÅ©·Î : int SIGUSR1
¸ÅÅ©·Î : int SIGUSR22
SIGUSR1 °ú SIGUSR2 ½Ã±×³¯µéÀº ´ç½ÅÀÌ ¿øÇÏ´Â ¾î¶² ¹æ¹ýÀ» »ç¿ëÇÏÁö ¸øÇϵµ·Ï ÇÑ´Ù. ±×µéÀº ÇÁ ·Î¼¼½º°£ Åë½ÅÀ» À§Çؼ À¯¿ëÇÏ´Ù. ±×µé ½Ã±×³¯À» º¸Åë ½É°¢Çϱ⠶§¹®¿¡ ´ç½ÅÀº ±× ½Ã±×³¯À» ¹ÞÀº ÇÁ·Î±×·¥¿¡¼ ±×µéÀº À§ÇÑ ½Ã±×³¯ 󸮸¦ ÇØ¾ßÇÒ °ÍÀÌ´Ù. SIGUSR1 °ú SIGUSR2¿¡ ´ëÇÑ »ç¿ë¿¹´Â 21.6.2Àý [Signaling Another Process] 295 ÆäÀÌÁö ÂüÁ¶.
21.2.7 ºñÇ¥ÁØ ½Ã±×³¯.
ƯÁ¤ÇÑ ¿î¿µÃ¼Á¦´Â À§¿¡ ¼³¸íµÇÁö ¾ÊÀº ºÎ°¡ÀûÀÎ ½Ã±×³¯µéÀ» Áö¿øÇÑ´Ù. ANSI C Ç¥ÁØÀº ½Ã±×³¯µé ÀÇ ¸íĪÀ» `SIG'·Î ½ÃÀÛÇÏ´Â ´ë¹®ÀÚ·Î ¿¹¾àÇÏ¿´´Ù. ´ç½ÅÀº ´ç½ÅÀÇ Æ¯Á¤ÇÑ ¿î¿µÃ¼Á¦¸¦ À§ÇÑ Çì´õÆÄ ÀÏÀ̳ª ±× ¿î¿µÃ¼Á¦°¡ Áö¿øÇϰí ÀÖ´Â ½Ã±×³¯À» ¹ß°ßÇÏ´Â ÇÁ·Î¼¼¼ÀÇ Å¸ÀÔ µî¿¡ ´ëÇÑ °Í¿¡ Á¶¾ðÀ» ±¸ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦µé¾î, ¾î¶² ½Ã½ºÅÛÀº Çϵå¿þ¾î Æ®·¦¿¡ ÇØ´çÇÏ´Â ¿©ºÐÀÇ ½Ã±×³¯µéÀ» Á¦°øÇÑ´Ù. º¸Åë Áö¿øµÇ´Â ¾î¶² ´Ù¸¥ Á¾·ùÀÇ ½Ã±×³¯µéÀº CPU ½Ã°£°ú ÆÄÀÏ ½Ã½ºÅÛ »ç¿ë¿¡ ´ëÇÑ Á¦ÇÑÀ» °¡Çϰгª, Å͹̳¯ ±¸¼ºÀ» ºñµ¿±âÀûÀ¸·Î º¯°æÇÏ´Â °Í°ú °°Àº °ÍÀ» À§ÇØ »ç¿ëµÇ¾îÁø´Ù. ½Ã½ºÅÛµéÀº ¶ÇÇÑ Ç¥ ÁØ ½Ã±×³¯ À̸§ÀÇ º°Äª(aliases)ÀÌ µÇ´Â ½Ã±×³¯ À̸§µéÀ» Á¤ÀÇÇϰí ÀÖ´Ù.
´ç½ÅÀº ´ç½ÅÀÌ ÀÌÇØÇϰí ÀÖ´Â Á¤ÀÇµÈ ½Ã±×³¯µéÀ» À§ÇÑ µðÆúÆ® µ¿ÀÛÀ» (¶Ç´Â ½©¿¡ÀÇÇØ ÀÛµ¿ÇÏ´Â µ¿ ÀÛ) °¡Á¤ÇÒ ¼ö ÀÖ°í, ´ç½ÅÀº ±×µé¿¡ ´ëÇØ¼´Â °ÆÁ¤ÇÏÁö ¾Ê´Â´Ù. ´ç½ÅÀÌ ±× ½Ã±×³¯ÀÇ Àǹ̸¦ ¾ËÁö¸ø Çϴ°Ϳ¡ ´ëÇØ¼ Çڵ鷯¸¦ ¸¸µé·Á ½ÃµµÇϰųª ¾ËÁö ¸øÇÏ´Â ½Ã±×³¯À» ¹«½ÃÇϰųª ºí·ÏÇÏ´Â °ÍÀº ÁÁ Áö¸øÇÑ »ý°¢ÀÌ´Ù. ¿©±â¿¡ ÀϹÝÀûÀ¸·Î ¿î¿µÃ¼Á¦¿¡¼ »ç¿ëµÇ°í ÀÖ´Â ¾à°£ÀÇ ´Ù¸¥ ½Ã±×³¯¿¡ ´ëÇÑ °ÍÀÌ ÀÖ´Ù.
SIGCLD
SIGCHLDÀÇ ¿À·¡µÈ ¸íĪ.
SIGTRAP
±â°è»óÀÇ Áß´ÜÁ¡ ¸í·É¿¡ ÀÇÇØ ¹ß»ýµÈ´Ù. µð¹ö°Å¿¡ ÀÇÇØ »ç¿ëµÈ´Ù. µðÆúÆ® µ¿ÀÛÀº ÄھƸ¦ ´ýÇÁÇÏ´Â °ÍÀÌ´Ù.
SIGIOT
PDP-II "iot" ¸í·É¿¡ ÀÇÇØ ¹ß»ýµÈ´Ù; SIGABRT¿Í µ¿µîÇÏ´Ù. µðÆúÆ® µ¿ÀÛÀº ÄھƸ¦ ´ýÇÁÇÏ´Â °ÍÀÌ ´Ù.
SIGEMT
¿¡¹Ä·¹ÀÌÅ͸¦ Æ®·¦ÇÑ´Ù; ¾î¶² ÃæÁ·µÇÁö ¸øÇÑ ¸í·ÉÀ¸·Î ºÎÅÍÀÇ °á°úÀÌ´Ù. ±×°ÍÀº ÇÁ·Î±×·¥ ¿¡·¯ ½Ã±×³¯ÀÌ´Ù.
SIGSYS
ÁÁÁö¸øÇÑ ½Ã½ºÅÛ È£Ãâ; ½ÇÇàµÈ ¿î¿µÃ¼Á¦¸¦ Æ®·¦Çϱâ À§ÇÑ ¸í·ÉÀÌÁö¸¸, ±×°ÍÀ» ¼öÇàÇϵµ·Ï ÇÏ´Â ½Ã ½ºÅÛ È£ÃâÀ» À§ÇÑ ÄÚµå ¹øÈ£°¡ À¯¿ëÇÏÁö ¾Ê´Ù. À̰ÍÀº ÇÁ·Î±×·¥ ¿¡·¯ ÀÌ´Ù.
SIGPOLL
À̰ÍÀº SIGIO¿Í ¸¹ÀÌ ¶Ç´Â ´ú À¯»çÇÑ, ½Ã½ºÅÛ V ½Ã±×³¯ ¸íĪÀÌ´Ù.
SIGXCPU
CPU ½Ã°£ Á¦ÇÑÀÌ ÃʰúµÇ¾ú´Ù. À̰ÍÀº ¹èÄ¡ ÇÁ·Î¼¼½ÌÀ» À§Çؼ »ç¿ëµÇ¾îÁø´Ù. µðÆúÆ® µ¿ÀÛÀº ÇÁ·Î ±×·¥ Á¾·áÀÌ´Ù.
SIGXFSZ
ÆÄÀÏ Å©±â Á¦ÇÑÀÌ ÃʰúµÇ¾ú´Ù. À̰ÍÀº ¹èÄ¡ ÇÁ·Î¼¼½ÌÀ» À§Çؼ »ç¿ëµÇ¾îÁø´Ù. µðÆúÆ® µ¿ÀÛÀº ÇÁ·Î ±×·¥ Á¾·áÀÌ´Ù.
SIGWINCH
À©µµ¿ì Å©±â¸¦ º¯°æÇÑ´Ù. À̰ÍÀº ½ºÅ©¸°¿¡¼ ÇöÀç À©µµ¿ìÀÇ Å©±â°¡ º¯°æµÇ¾úÀ» ¶§ ¾î¶² ½Ã½ºÅÛ¿¡ ¼ ¹ß»ýµÇ¾îÁø´Ù. µðÆúÆ® µ¿ÀÛÀº ±×°ÍÀ» ¹«½ÃÇÏ´Â °ÍÀÌ´Ù.
21.2.8 ½Ã±×³¯ ¸Þ¼¼Áö.
¿ì¸®´Â ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ Á¾·áÇÑ ½Ã±×³¯À» ¼³¸íÇÏ´Â ¸Þ½ÃÁö¸¦ ½©ÀÌ ÇÁ¸°Æ®Çϴ°Ϳ¡ ´ëÇØ¼´Â À§¿¡ ¼ Àá±ñ ¾ð±ÞÇß´Ù. ½Ã±×³¯À» ¼³¸íÇÏ´Â ¸Þ½ÃÁö¸¦ ÇÁ¸°Æ®ÇÏ´Â ±ú²ýÇÑ ¹æ¹ýÀº strsignal °ú psignal ÇÔ¼ö µéÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ±×µé ÇÔ¼öµéÀº ¼³¸íÇÏ·Á´Â ½Ã±×³¯ÀÇ Á¾·ù¸¦ ÁöÁ¤Çϱâ À§Çؼ ½Ã±×³¯ ¹øÈ£¸¦ »ç¿ëÇÑ´Ù ½Ã±×³¯ ¹øÈ£´Â ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ Á¾·á »óȲÀ¸·ÎºÎÅÍ( 23.6Àý [Process Compltion] 329 ÆäÀÌ Áö ÂüÁ¶.) ¿À°Å³ª ¶Ç´Â °°Àº ÇÁ·Î¼¼½º¾È¿¡ ÀÖ´Â ½Ã±×³¯ Çڵ鷯·¯ºÎÅÍ ¿Ã °ÍÀÌ´Ù.
ÇÔ¼ö : char * strsignal (int signum)
ÀÌ ÇÔ¼ö´Â ½Ã±×³¯ signumÀ» ¼³¸íÇϰí ÀÖ´Â ¸Þ½ÃÁö¸¦ Æ÷ÇÔÇϰí ÀÖ´Â Á¤ÀûÀ¸·Î ÇÒ´çµÈ ¹®ÀÚ¿¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ´ç½ÅÀº ÀÌ ¹®ÀÚ¿ÀÇ ³»¿ëÀ» °»½ÅÇÒ ¼ö ¾ø´Ù; ±×¸®°í ±×°ÍÀº ¿¬¼ÓµÈ È£Ãâ¿¡ ÀÇ ÇØ¼ µ¡¾º¿öÁú ¼ö ÀÖÀ¸¹Ç·Î, ´ç½ÅÀº ¸¸ÀÏ ±×°ÍÀ» ³ªÁß¿¡ ÂüÁ¶ ÇÒ Çʿ䰡 ÀÖ´Ù¸é µû·Î ÀúÀåÇØ¾ßÇÒ °Í ÀÌ´Ù. ÀÌ ÇÔ¼ö´Â GNU È®Àå À¸·Î Çì´õÆÄÀÏ `string.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
ÇÔ¼ö : void psignal (int signum, const char *message)
ÀÌ ÇÔ¼ö´Â Ç¥ÁØ ¿¡·¯ Ãâ·Â ½ºÆ®¸² stderr¿¡ ½Ã±×³¯ signumÀ» ¼³¸íÇÏ´Â ¸Þ½ÃÁö¸¦ ÇÁ¸°Æ® ÇÑ´Ù; 7.2Àý [Standard Streams] 63ÆäÀÌÁö ÂüÁ¶. ¸¸ÀÏ ´ç½ÅÀÌ ³Î Æ÷ÀÎÅÍÀ̰ųª ¶Ç´Â ºó ¹®ÀÚ¿ÀÎ message¸¦ °¡ Áö°í psignalÀ» È£ÃâÇϸé, psignalÀº ´ÜÁö »õÁÙÀ» Çϳª µ¡ºÙ¿©¼ signum¿¡ ÇØ´çÇÏ´Â ¸Þ½ÃÁö¸¦ ÇÁ¸° Æ® ÇÑ´Ù. ¸¸ÀÏ ´ç½ÅÀÌ ³ÎÀÌ ¾Æ´Ñ message Àμö¸¦ °ø±ÞÇϸé, psignalÀº ÀÌ ¹®ÀÚ¿·Î ±× Ãâ·ÂÀÇ ¾Õ¿¡ ³õ´Â´Ù. ±×°ÍÀº signum¿¡ ÇØ´çÇÏ´Â ¹®ÀÚ¿·ÎºÎÅÍ ¸Þ¼¼Áö¸¦ ºÐ¸®Çϱâ À§ÇÑ °ø¹éÀ̳ª ÄÝ·ÐÀ» ´õÇÑ´Ù. ÀÌ ÇÔ¼ö´Â BSD¸¦ À§ÇѰÍÀ̰í, Çì´õÆÄÀÏ `stdio.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù. ¶ÇÇÑ ´Ù¾çÇÑ ½Ã±×³¯ ÄÚµåµéÀ» À§ÇÑ ¸Þ½ÃÁö¸¦ Æ÷ÇÔÇϰí ÀÖ´Â ¹è¿ sys_siglist°¡ ÀÖ´Ù. ÀÌ ¹è¿Àº strsiganl°ú ´Þ¸® BSD ½Ã½ºÅÛ»ó ¿¡ Á¸ÀçÇÑ´Ù
21.3 ½Ã±×³¯ µ¿ÀÛ Á¤Çϱâ.
½Ã±×³¯À» À§ÇÑ µ¿ÀÛÀ» º¯°æÇϱâ À§ÇÑ °¡Àå °£´ÜÇÑ ¹æ¹ýÀº signalÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ´ç½ÅÀº ³» ÀåµÈ(built-in) µ¿ÀÛÀ» ÁöÁ¤Çϰųª, Çڵ鷯¸¦ ¸¸µé ¼ö ÀÖ´Ù. GNU ¶óÀ̺귯¸®´Â ¶ÇÇÑ Á»´õ ´Ù¾çÇÑ ±â ´ÉÀ» °¡Áø sigaction µµ±¸¸¦ »ç¿ëÇÑ´Ù. ÀÌÀýÀº µÎ °³ÀÇ µµ±¸µé¿¡ ´ëÇÑ ¼³¸í°ú ¾ðÁ¦ À̰ÍÀ» »ç¿ëÇÒÁö ¿¡ ´ëÇÑ Á¦¾ÈÀ» ÇÑ´Ù.
21.3.1 ±âº» ½Ã±×³¯ ó¸®.
signal ÇÔ¼ö´Â ƯÁ¤ÇÑ ½Ã±×³¯À» À§ÇÑ µ¿ÀÛÀ» ¸¸µé±â À§ÇÑ °£´ÜÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù. ±× ÇÔ¼ö ¿Í ¿¬°üµÈ ¸ÅÅ©·ÎµéÀº Çì´õÆÄÀÏ `signal.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
µ¥ÀÌÅÍ Å¸ÀÔ : sighandler__t
À̰ÍÀº ½Ã±×³¯ Çڵ鷯 ÇÔ¼öµéÀÇ Å¸ÀÔÀÌ´Ù. ½Ã±×³¯ Çڵ鷯µéÀº ½Ã±×³¯ ¹øÈ£¸¦ ÁöÁ¤Çϱâ À§Çؼ Á¤ ¼öÀμö¸¦ Çϳª ÃëÇϰí, ¸®ÅÏ Å¸ÀÔÀ¸·Î´Â void ÇüÀ» °¡Áø´Ù. ±×·¡¼ ´ç½ÅÀº ´ÙÀ½°ú °°ÀÌ Çڵ鷯 ÇÔ¼ö ¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.
void handler (int signum) { . . . }
ÀÌ µ¥ÀÌÅÍ Å¸ÀÔÀ» À§ÇÑ sinhandler_t´Â GNU È®ÀåÀÌ´Ù.
ÇÔ¼ö : sighandler_t signal (int signum, sighandler_t action)
signal ÇÔ¼ö´Â ½Ã±×³¯ signamÀ» À§ÇÑ µ¿ÀÛÀ» actionÀ¸·Î ¸¸µç´Ù. ù ¹øÂ° Àμö, signumÀº ´ç½ÅÀÌ Á¦ ¾îÇϱ⠿øÇÏ´Â ÇൿÀ» °¡Áø ½Ã±×³¯À» ½Ã±×³¯ ¹øÈ£·Î½á ÁöÁ¤ÇÑ´Ù. ½Ã±×³¯ ¹øÈ£¸¦ ÁöÁ¤Çϱâ À§ÇÑ Àû ´çÇÑ ¹æ¹ýÀº 21.2Àý [Standard Signals] 272 ÆäÀÌÁö¿¡¼ ¼³¸íµÈ ½Éº¼¸¯ ½Ã±×³¯ À̸§µéÁß Çϳª¸¦ »ç¿ë ÇÏ´Â °ÍÀÌ´Ù_ÁÖ¾îÁø ½Ã±×³¯ÀÇ Á¾·ù¸¦ À§ÇÑ ¼ýÀÚ ÄÚµåµéÀº ¼·Î ´Ù¸¥ ¿î¿µÃ¼Á¦¿¡¼´Â º¯ÈÇÒ ¼ö ÀÖ ±â ¶§¹®¿¡ ¸í¹éÇÑ ¼ýÀÚ¸¦ »ç¿ëÇÏ´Â °ÍÀ» »ï°¡¶ó.
µÎ ¹øÂ° Àμö, actionÀº ½Ã±×³¯ signumÀ» À§ÇØ »ç¿ëÇÏ´Â µ¿ÀÛÀ» ÁöÁ¤ÇÑ´Ù. ´ÙÀ½ÁßÀÇ Çϳª°¡ »ç¿ëµÉ ¼ö ÀÖ´Ù.
SIG_DFL
SIG_DFL Àº ƯÁ¤ÇÑ ½Ã±×³¯À» À§ÇÑ µðÆúÆ® µ¿ÀÛÀ» ÁöÁ¤ÇÑ´Ù. ´Ù¾çÇÑ Á¾·ùÀÇ ½Ã±×³¯µéÀ» À§ÇÑ µð ÆúÆ® µ¿ÀÛµéÀº 21.2Àý [Standard Signals] 272 ÆäÀÌÁö¿¡ ³ª¿ÍÀÖ´Ù.
SIG_IGN
SIG_IGNÀº ½Ã±×³¯ÀÌ ¹«½ÃµÇµµ·Ï Á¤ÇÑ´Ù. ´ç½ÅÀÇ ÇÁ·Î±×·¥Àº ½É°¢ÇÑ »ç°ÇµéÀ» Ç¥ÇöÇϰųª, ¶Ç´ÂÁ¾ ·á¸¦ ¿äûÇϴµ¥ »ç¿ëµÇ´Â ½Ã±×³¯µéÀº º¸Å빫½ÃÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ´ç½ÅÀº ÀüÇô SIGKILL ¶Ç´Â SIGSTOP½ÅÈ£¸¦ ¹«½ÃÇÒ ¼ö ¾ø´Ù. ´ç½ÅÀº SIGSEGV¿Í °°Àº ÇÁ·Î±×·¥ ¿¡·¯ ½Ã±×³¯µéÀ» ¹«½ÃÇÒ ¼ö ÀÖÁö¸¸, ¿¡·¯¸¦ ¹«½ÃÇÏ´Â °ÍÀÌ ½ÇÇàÀ» °è¼ÓÇϵµ·Ï ÇÁ·Î±×·¥À» °¡´ÉÇÏ°Ô ¸¸µå´Â °ÍÀº ¾Æ´Ï´Ù. SIGINT, SIGQUIT ±×¸®°í SIGTSTP¿Í °°Àº »ç¿ëÀÚÀÇ ¿äûÀ» ¹«½ÃÇÏ´Â °ÍÀº »ç¿ëÀÚ¸¦ ºÒÄèÇÏ°Ô ¸¸ µç´Ù.
´ç½ÅÀÌ ÇÁ·Î±×·¥ÀÇ ¾î¶² ºÎºÐÀÌ ½ÇÇàµÇ´Â µ¿¾È¿¡ ½Ã±×³¯ÀÌ ¹è´ÞµÇ´Â °ÍÀ» ¿øÇÏÁö ¾ÊÀ» ¶§, ±×µéÀ» ºí·ÏÇϱâ À§Çؼ »ç¿ëÇϴ°ÍÀÌÁö ±×µéÀ» ¹«½ÃÇÏ´Â °ÍÀÌ ¾Æ´Ï´Ù. 21.7Àý [Blocking Signals] 298 Æä ÀÌÁö ÂüÁ¶.
handler
¾î¶² ½Ã±×³¯ÀÌ ¹è´ÞµÇ¾úÀ» ¶§ ÀÌ Çڵ鷯°¡ ÀÛµ¿Çϵµ·Ï Çϱâ À§Çؼ ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡ Çڵ鷯 ÇÔ¼ö ÀÇ ÁÖ¼Ò¸¦ °ø±ÞÇÑ´Ù. ½Ã±×³¯ Çڵ鷯 ÇÔ¼ö¸¦ Á¤ÀÇÇϱ⿡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸´Â 21.4Àý [Defining Handlers] 285 ÆäÀÌÁö ÂüÁ¶. ¸¸ÀÏ ´ç½ÅÀÌ SIG_IGNÀ¸·Î ½Ã±×³¯À» À§ÇÑ µ¿ÀÛÀ» ¼³Á¤Ç߰ųª, ¶Ç´Â SIG_DFL·Î ¼³Á¤ÇÏ°í µðÆúÆ® µ¿ÀÛÀÌ ½Ã±×³¯À» ¹«½ÃÇÏ´Â °ÍÀ̶ó¸é ¾î´À ¹ÌÇØ°áµÈ ½Ã±×³¯µéÀº ¹ö·ÁÁø ´Ù( ½ÉÁö¾î ±×µéÀÌ ºí·ÏµÇ¾úÀ» Áö¶óµµ ). ¹ÌÇØ°áÀÎ ½Ã±×³¯µéÀ» ¹ö¸®´Â °ÍÀº, ½ÉÁö¾î ´ç½ÅÀÌ ±× ½Ã±× ³¯À» À§ÇÑ ´Ù¸¥ µ¿ÀÛÀ» ÁöÁ¤ÇÏ°í ºí·ÏÀ» ÇØÁ¦Çϵµ·Ï ¿¬¼ÓÀûÀ¸·Î Á¤ÇÒÁö¶óµµ ±×µéÀÌ °áÄÚ ¹è´ÞµÇ¾î ÁöÁö ¾ÊÀ» °ÍÀÓÀ» ÀǹÌÇÑ´Ù.
signal ÇÔ¼ö´Â Á¤ÇØÁø signum ½Ã±×³¯À» À§Çؼ È¿·ÂÀÌ ÀÖ¾ú´ø µ¿ÀÛÀ» ¸®ÅÏÇÑ´Ù. ´ç½ÅÀº ÀÌ °ªÀ» Àú ÀåÇÒ ¼ö ÀÖ°í ³ªÁß¿¡ ´Ù½Ã signalÀ» È£ÃâÇÔÀ¸·Î½á ±×°ÍÀ» ´Ù½Ã ¹ÝȯÇÑ´Ù. ¸¸ÀÏ signalÀÌ ¿äûÀ» ¹Þ ¾ÆµéÀÏ ¼ö ¾ø´Ù¸é, ±×°ÍÀº ´ë½Å¿¡ SIG_ERRÀ» ¸®ÅÏÇÑ´Ù. ´ÙÀ½ÀÇ errno´Â ÀÌ ÇÔ¼ö¸¦ À§ÇØ Á¤ÀÇµÈ ¿¡ ·¯ »óȲÀÌ´Ù.
EINVAL
´ç½ÅÀº À¯¿ëÇÏÁö ¾ÊÀº signumÀ» ÁöÁ¤ÇÏ¿´°Å³ª; ¶Ç´Â SIGKILL À̳ª SIGSTOP¸¦ À§ÇÑ Çڵ鷯¸¦
Á¦°øÇϰųª ¹«½ÃÇÏ·Á ½ÃµµÇß´Ù. ¾î¶² ½É°¢ÇÑ ½Ã±×³¯ÀÌ ¹ß»ýÇßÀ» ¶§ ÀÓ½ÃÆÄÀϵéÀ» Áö¿ì±â À§ÇÑ ÇÚµé ·¯¸¦ ¼³Á¤ÇÏ´Â °£´ÜÇÑ ¿¹Á¦ÀÌ´Ù.
#include <signal.h>
void
termination_handler (int signum)
{
struct temp_file *p;
for (p = temp_file_list; p; p = p->next)
unlink (p->name);
}
int
main (void)
{
. . .
if (signal (SIGINT, termination_handler) == SIG_IGN)
signal (SIGINT, SIG_IGN);
if (signal (SIGHUP, termination_handler) == SIG_IGN)
signal (SIGHUP, SIG_IGN);
if (signal (SIGTERM, termination_handler) == SIG_IGN)
signal (SIGTERM, SIG_IGN);
. . .
}
ÁÖ¾îÁø ½Ã±×³¯ÀÌ ¹«½ÃµÇµµ·Ï ¹Ì¸® ¼³Á¤µÇ¾îÁ³´Ù¸é, ÀÌ ÄÚµå´Â ±× ¼³Á¤À» ¹Ù²Ù´Â °ÍÀ» ÇÇÇÔÀ» ±â¾ï Ç϶ó. À̰ÍÀº ºñ-ÀÛ¾÷-Á¦¾î ½©µéÀÌ ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ½ÃÀÛµÉ ¶§ ¾î¶² ½Ã±×³¯µéÀ» Á¾Á¾ ¹«½ÃÇϱ⠶§ ¹®À̰í, ±×¸®°íÀ̰ÍÀ» °í·ÁÇÏ´Â °ÍÀº ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô´Â Áß¿äÇÏ´Ù. ¿ì¸®´Â ÀÌ ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ µð ¹ö±ëÀ» À§Çؼ(ÄÚ¾Æ ´ýÇÁ ÆÄÀÏ) Á¤º¸¸¦ Á¦°øÇϵµ·Ï ¸¸µé¾îÁ³±â ¶§¹®¿¡ ÇÁ·Î±×·¥ ¿¡·¯ ½Ã±×³¯À̳ª SIGQUIT¸¦ ó¸®ÇÏÁö ¾Ê°í, Àӽà ÆÄÀϵéÀº À¯¿ëÇÑ Á¤º¸¸¦ °¡Áú °ÍÀÌ´Ù.
ÇÔ¼ö : sighandler_t ssignal (int signum, sighandler_t action)
ssignal ÇÔ¼ö´Â signal°ú °°Àº ÀÏÀ» ÇÑ´Ù; À̰ÍÀº ¿ÀÁ÷ SVID¿ÍÀÇ È£È¯¼ºÀ» À§Çؼ Á¦°øµÇ¾îÁ³´Ù.
¸ÅÅ©·Î: sighandler_t SIG__ERR
ÀÌ ¸ÅÅ©·ÎÀÇ °ªÀº ¿¡·¯¸¦ ÁöÀûÇÏ´Â signalÇÔ¼ö·ÎºÎÅÍÀÇ ¸®ÅϰªÀ¸·Î½á »ç¿ëµÇ¾îÁø´Ù.
21.3.2 Áøº¸µÈ ½Ã±×³¯ ó¸®.
sigaction ÇÔ¼ö´Â signal°ú °°Àº ±âº» È¿°ú¸¦ °®´Â´Ù: ÇÑ ½Ã±×³¯ÀÌ ¾î¶»°Ô ÇÁ·Î¼¼½º¿¡ ÀÇÇØ ó¸®µÉ °ÍÀÎÁö¸¦ Á¤ÇÏ´Â. sigactionÀº Á¶±ÝÀº º¹ÀâÇÏÁö¸¸, ´õ ¸¹Àº Á¦¾î¸¦ Á¦°øÇÑ´Ù. Ưº°ÇϰÔ, sigacionÀº ½Ã±×³¯ÀÌ ¾ðÁ¦ ¹ß»ýµÇ°í ¾î¶»°Ô ±× Çڵ鷯°¡ È£ÃâµÉ°ÍÀÎÁö¿¡ ´ëÇØ Á¦¾î¸¦ ÇÒ ¼ö ÀÖ´Â ºÎ°¡ÀûÀÎ Çà ·¡±×¸¦ ÁöÁ¤Çϵµ·Ï Çã¿ëÇÑ´Ù. sigaction ÇÔ¼ö´Â `signal.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
µ¥ÀÌÅÍ Å¸ÀÔ : struct sigaction
struct sigacion ŸÀÔÀÇ ±¸Á¶Ã¼µéÀº ¾î¶»°Ô ƯÁ¤ÇÑ ½Ã±×³¯À» ó¸® ÇÒ°ÍÀÎÁö¿¡ ´ëÇÑ ¸ðµç Á¤º¸¸¦ Áö Á¤Çϱâ À§Çؼ sigaction ÇÔ¼ö¿¡¼ »ç¿ëµÈ´Ù. ÀÌ ±¸Á¶Ã¼´Â Àû¾îµµ ´ÙÀ½ÀÇ ¸â¹öµéÀ» °®°í ÀÖ´Ù.
sighandler_t sa_handler
À̰ÍÀº signal ÇÔ¼öÀÇ actionÀμö¿Í °°Àº ¹æ¹ýÀ¸·Î »ç¿ëµÇ¾îÁø´Ù. ±× °ªÀº SIG_DFL, SIG_IGN ¶Ç´Â ÇÔ¼ö Æ÷ÀÎÅͰ¡ µÉ ¼öÀÖ´Ù. 21.3.1Àý [Basic Signal Handling] 280 ÆäÀÌÁö ÂüÁ¶.
sigset_t sa_mask
À̰ÍÀº Çڵ鷯°¡ ÀÛµ¿µÇ°í ÀÖ´Â µ¿¾È ºí·ÏµÉ ½Ã±×³¯ÀÇ ÁýÇÕÀ» ¼³Á¤ÇÑ´Ù. ºí·ÏÅ·¿¡ ´ëÇÑ °ÍÀº 21.7.5 Àý [Blocking for Handler] 301 ÆäÀÌÁö¿¡ ¼³¸íµÇ¾î ÀÖ´Ù. ½Ã±×³¯ÀÌ ¹è´ÞµÇ¾úÀ» ¶§ Çڵ鷯°¡ ÀÛµ¿µÇ ±âÀü¿¡ µðÆúÆ®·Î½á ÀÚµ¿ÀûÀ¸·Î ºí·ÏµÊÀ» ¾Ë¾ÆµÖ¶ó; À̰ÍÀº sa_mask¿¡ ÀÖ´Â °ª¿¡ »ó°üÇÏÁö ¾Ê´Â´Ù. ¸¸ÀÏ ´ç½ÅÀÌ ¾î¶² ½Ã±×³¯ÀÌ Çڵ鷯¾È¿¡¼ ºí·ÏµÇ¾îÁöÁö ¾Ê±â¸¦ ¿øÇÑ´Ù¸é, ´ç½ÅÀº Çڵ鷯 ¾È¿¡ ÀÖ´Â Äڵ忡 ±×°ÍÀ» ºí·ÏÇÏÁö ¾ÊÀ»°ÍÀÔÀ» Àû¾î¾ß ÇÑ´Ù.
int sa_flags
À̰ÍÀº ½Ã±×³¯ÀÇ µ¿ÀÛ¿¡ ¿µÇâÀ» ¹ÌÄ¥ ¼ö ÀÖ´Â ´Ù¾çÇÑ Ç÷¡±×µéÀ» ÁöÁ¤ÇÑ´Ù. À̵鿡 ´ëÇÑ °ÍÀº 21.3.5Àý [Flags for Sigaction] 284 ÆäÀÌÁö¿¡ Á»´õ ÀÚ¼¼ÇÏ°Ô ¼³¸íµÇ¾î ÀÖ´Ù.
ÇÔ¼ö : int sigaction(int signum, const struct sigaction *action, struct sigaction *old_action)
action Àμö´Â ½Ã±×³¯ signumÀ» À§ÇÑ »õ·Î¿î µ¿ÀÛÀ» ÁغñÇϱâ À§Çؼ »ç¿ëµÇ°í, old_action Àμö´Â ÀÌ ½Éº¼°ú ¿¬°üµÈ ÀÌÀüÀÇ µ¿ÀÛ¿¡´ëÇÑ Á¤º¸¸¦ ¸®ÅÏÇϱâ À§ÇØ »ç¿ëµÈ´Ù. (Áï, old_actionÀº signal ÇÔ¼ö ÀÇ ¸®Åϰª°ú °°Àº ¸ñÀûÀ» °®´Â´Ù_´ç½ÅÀº ±× ½Ã±×³¯¿¡ ¿µÇâÀ» ¹ÌÃÆ´ø ÀÌÀüÀÇ µ¿ÀÛÀÌ ¹«¾ùÀ̾ú´ÂÁö¸¦ ¾Ë ¼ö ÀÖÀ»»Ó¸¸ ¾Æ´Ï¶ó ³ªÁß¿¡ ¸¸ÀÏ ´ç½ÅÀÌ ¿øÇÑ´Ù¸é ±× µ¿ÀÛÀ» ´Ù½Ã ¹ÝȯÇÒ ¼öµµ ÀÖ´Ù.) action ¶Ç ´Â old_action ÁßÀÇ Çϳª´Â ³Î Æ÷ÀÎÅͰ¡ µÉ ¼ö ÀÖ´Ù. ¸¸ÀÏ old_action ÀÌ ³Î Æ÷ÀÎÅͶó¸é, ÀÌÀüµ¿ÀÛ(old action)¿¡ ´ëÇÑ Á¤º¸¸¦ ¸®ÅÏÇÏ´Â °ÍÀÌ »ý·«µÈ´Ù. ¸¸ÀÏ actionÀÌ ³Î Æ÷ÀÎÅͶó¸é, ½Ã±×³¯ signum°ú ¿¬ °üµÈ µ¿ÀÛÀÌ º¯°æµÇÁö ¾Ê´Â´Ù; À̰ÍÀº ¿ø·¡ÀÇ ½Ã±×³¯ÀÌ °¡Áø µ¿ÀÛÀº º¯°æÇÔÀÌ ¾øÀÌ ½Ã±×³¯À» ó¸® ÇÒ ¼ö ÀÖÀ½À» Çã¿ëÇÑ´Ù.
sigactionÀ¸·ÎºÎÅÍÀÇ ¸®ÅϰªÀº ¸¸ÀÏ ¼º°øÇϸé 0À̰í, ½ÇÆÐÇϸé -1À» ¸®ÅÏÇÑ´Ù. ´ÙÀ½ÀÇ errno´Â ÀÌ ÇÔ ¼ö¸¦ À§ÇØ Á¤ÀÇµÈ ¿¡·¯»óȲÀÌ´Ù.
EINVAL
signumÀμö°¡ À¯¿ëÇÏÁö ¾Ê°Å³ª, ´ç½ÅÀÌ SIGKILL ¶Ç´Â SIGSTOP ½Ã±×³¯À» ¹«½ÃÇϰųª Æ®·¦ÇÏ·Á°í ½ÃµµÇÏ¿´´Ù.
21.3.3 signal °ú sigaction ÀÇ »óÈ£ÀÛ¿ë.
ÇÑ ´ÜÀÏÇÑ ÇÁ·Î±×·¥¾È¿¡¼ signal °ú sigaction ÇÔ¼öµéÀ» ¸ðµÎ »ç¿ëÇÏ´Â °ÍÀÌ °¡´ÉÇÏÁö¸¸, ±×µéÀº ¿Ï ÀüÈ÷ ´Ù¸¥ ¹æ¹ýµé·Î ¼·Î ¿µÇâÀ» ¹ÌÄ¥¼ö Àֱ⠶§¹®¿¡ ÁÖÀÇÇØ¾ß¸¸ ÇÑ´Ù. sigaction ÇÔ¼ö´Â signal ÇÔ ¼öº¸´Ù´Â Á»´õ ¸¹Àº Á¤º¸¸¦ ÁöÁ¤Çϱ⠶§¹®¿¡, signal·ÎºÎÅÍÀÇ ¸®ÅϰªÀº sigactionÀÌ Ç¥ÇöÇÒ¼ö ÀÖ´Â ¹ü À§¸¦ Ç¥ÇöÇÒ ¼ö ¾ø´Ù. ±×·¸Áö¸¸, ¸¸ÀÏ ´ç½ÅÀÌ ¾î´À µ¿ÀÛÀ» ÀúÀåÇÏ°í ³ªÁß¿¡ ´Ù½Ã ±× µ¿ÀÛÀ» Àç°ÇÇÏ ±âÀ§Çؼ signalÀ» »ç¿ëÇÑ´Ù¸é, sigactionÀ» ÅëÇØ¼ ¸¸µé¾îÁ³´ø Çڵ鷯´Â Àû´çÇÏ°Ô Àç°ÇµÇ¾îÁú ¼ö ¾ø À» °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇÇÇϱâ À§Çؼ, Çڵ鷯°¡ ÀüÇô sigactionÀ» »ç¿ëÇÏÁö ¾ÊÀº ÇÁ·Î±×·¥À̶ó °í ÇÒÁöÇϵµ Çڵ鷯´Â ÀúÀåÇÏ°í ¹ÝȯÇϱâ À§Çؼ´Â Ç×»ó sigactionÀ» »ç¿ëÇ϶ó. sigactionÀÌ Á»´õ ÀÏ ¹ÝÀûÀ̱⠶§¹®¿¡, ¿ø·¡ siganl ¶Ç´Â sigactionÀ» °¡Áö°í ¸¸µé¾ú´ÂÁö¿¡ »ó°ü¾øÀÌ, ¾î´À µ¿ÀÛÀ» ÀúÀåÇÏ °í Àç°ÇÇϱâ À§Çؼ sigactionÀ» »ç¿ëÇÏ´Â °ÍÀÌ ´õ Àû´çÇÒ ¼ö ÀÖ´Ù.
¸¸ÀÏ signalÀ» »ç¿ëÇØ¼ ¾î¶² µ¿ÀÛÀ» ¸¸µé¾ú°í ±×´ÙÀ½ sigactionÀ» »ç¿ëÇØ¼ ±×°ÍÀ» ½ÃÇèÇÑ´Ù¸é, ÇÚ µé·¯ ÁÖ¼Ò´Â ´ç½ÅÀÌ signal¿¡¼ ÁöÁ¤Çß´ø °Í°ú °°Áö ¾ÊÀº °ÍÀ» ¾ò°Ô µÉ °ÍÀÌ´Ù. ±×°ÍÀº ½ÉÁö¾î signal¿¡ actionÀμö·Î½á »ç¿ëÇϱ⿡µµ Àû´çÇÏÁö ¾Ê°Ô µÉ °ÍÀÌ´Ù. ±×·¯³ª ´ç½ÅÀº sigactionÀÇ Àμö·Î ½á ±×°ÍÀ» »ç¿ëÇϰí Àû¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¡¼, ´ÜÀÏÇÑ ÇÁ·Î±×·¥¾È¿¡¼´Â ½ÃÁ¾Àϰü ÇѰ¡Áö ¶Ç´Â ´Ù¸¥ ÇѰ¡ÁöÀÇ ¸ÞÄ«´ÏÁòÀ» °í¼öÇÏ´Â °ÍÀÌ ÇÑ°á ´õ ³´´Ù.
À̽ļº ³ëÆ® : ±âº» signal ÇÔ¼ö´Â ANSI C¿¡¼ Áö¿øµÇ°í, sigactionÇÔ¼ö´Â POSIX.1 Ç¥ÁØ¿¡¼ Áö¿ø Çϰí ÀÖ´Ù. ¸¸ÀÏ ´ç½ÅÀÌ ºñ-POSIX °è¿ÀÇ ½Ã½ºÅÛ °úÀÇ È£È¯¼º¿¡ °ü½ÉÀÌ ÀÖ´Ù¸é, ´ç½ÅÀº ´ë½Å¿¡ signalÀ» »ç¿ëÇ϶ó.
21.3.4 sigaction ÇÔ¼ö ¿¹Á¦
21.3.1Àý [Basic Signal Handling] 280 ÆäÀÌÁö¿¡¼, signalÀ» »ç¿ëÇØ¼ Á¾·á ½Ã±×³¯µéÀ» À§ÇÑ °£´ÜÇÑ Çڵ鷯¸¦ ¸¸µå´Â ¿¹Á¦¸¦ º¸¿©ÁÖ¾ú´Ù. ´ÙÀ½Àº sigactionÀ» »ç¿ëÇÏ´Â °°Àº ¿¹Á¦ÀÌ´Ù.
#include <signal.h>
void
termination_handler (int signum)
{
struct temp_file *p;
for (p = temp_file_list; p; p = p->next)
unlink (p->name);
}
int
main (void)
{
. . .
struct sigaction new_action, old_action;
/* »õ·Î¿î µ¿ÀÛÀ» ÁöÁ¤ÇÒ ±¸Á¶Ã¼¸¦ ÁغñÇ϶ó. */
new_action.sa_handler = termination_handler;
sigemptyset (&new_action.sa_mask);
new_action.sa_flags = 0;
sigaction (SIGINT, NULL, &old_action);
if (old_action.sa_handler != SIG_IGN)
sigaction (SIGINT, &new_action, NULL);
sigaction (SIGHUP, NULL, &old_action);
if (old_action.sa_handler != SIG_IGN)
sigaction (SIGHUP, &new_action, NULL);
sigaction (SIGTERM, NULL, &old_action);
if (old_action.sa_handler != SIG_IGN)
sigaction (SIGTERM, &new_action, NULL);
. . .
}
ÀÌ ÇÁ·Î±×·¥Àº ¿ä±¸µÈ ÆÄ¶ó¹ÌÅÍ·Î ´ÜÁö new_actionÀ» ·ÎµåÇϰí sigactionÀ» È£ÃâÇÒ ¶§ ±×°ÍÀ» Àμö ·Î½á »ç¿ëÇÑ´Ù. sigemptysetÀÇ »ç¿ë¿¡ ´ëÇÑ °ÍÀº ³ªÁß¿¡ ¼³¸íµÇ¾ú´Ù; 21.7Àý [Blocking Signals] 298 ÆäÀÌÁö ÂüÁ¶. signalÀ» »ç¿ëÇÏ´Â ¿¹Á¦¿¡¼, ¹Ì¸® ¹«½ÃµÇµµ·Ï ¼³Á¤µÈ ½Ã±×³¯µéÀ» ó¸® ÇÏ´Â °ÍÀ» ÇÇ Çß´Ù. ¿©±â¼ »õ·Î¿î µ¿ÀÛÀ» ÁöÁ¤ÇÏÁö ¾Ê°í ÇöÀçÀÇ µ¿ÀÛÀ» ½ÃÇèÇÏ´Â °ÍÀ» Çã¿ëÇÏ´Â sigactionÀ» »ç ¿ëÇØ¼, ¼ø°£ÀûÀ¸·Î ½Ã±×³¯Çڵ鷯°¡ º¯°æµÇ´Â°ÍÀ» ÇÇÇÒ ¼ö ÀÖ´Ù.
´ÙÀ½Àº ´Ù¸¥ ¿¹Á¦ÀÌ´Ù. À̰ÍÀº µ¿ÀÛÀ» º¯°æÇÏÁö ¾Ê°í SIGINT¸¦ À§Çؼ ÇöÀçÀÇ µ¿ÀÛ¿¡ ´ëÇÑ Á¤º¸ ¸¦ ±¸ÇÑ´Ù.
struct sigaction query_action;
if (sigaction (SIGINT, NULL, &query_action) < 0)
/* ¿¡·¯°¡ ¹ß»ýÇϸé sigactionÀº -1À» ¸®ÅÏÇÑ´Ù. */
else if (query_action.sa_handler == SIG_DFL)
/* SIGINT´Â ¿ø·¡ ÀÚ½ÅÀÌ °¡Áö°í ÀÖ´ø µðÆúÆ® µ¿ÀÛÀ¸·Î 󸮵Ǿú´Ù. */
else if (query_action.sa_handler == SIG_IGN)
/* SIGINT´Â ¹«½ÃµÇ¾ú´Ù. */
else
/* ÇÁ·Î±×·¡¸Ó°¡ ¸¸µç Çڵ鷯°¡ È¿·ÂÀ» ¹ßÈÖÇÏ¿´´Ù. */
21.3.5 sigactionÀ» À§ÇÑ Ç÷¡±×.
sigaction ±¸Á¶Ã¼ÀÇ ¸â¹ö sa_flags´Â Ưº°ÇÑ ±â´ÉÀ» À§ÇÑ °ÍÀÌ´Ù. ´ëºÎºÐÀÇ °æ¿ì¿¡, SA_RESTART °¡ ÀÌ Çʵ忡¼ »ç¿ëÇϱ⿡ °¡Àå ÁÁÀº °ªÀÌ´Ù. sa_flagsÀÇ °ªÀº ºñÆ® ¸¶½ºÅ©·Î½á ÇØ¼®µÇ¾îÁø´Ù. ±× ·¡¼, ´ç½ÅÀº ´ç½ÅÀÌ ¿øÇÏ´Â Ç÷¡±×¸¦ ¼³Á¤Çϰųª ¼±ÅÃÇÒ ¼ö ÀÖ°í, sigaction ±¸Á¶Ã¼ÀÇ sa_flags ¸â¹ö ¾È¿¡ ±× °á°ú¸¦ ÀúÀåÇÑ´Ù. °¢°¢ÀÇ ½Ã±×³¯ ¹øÈ£´Â ÀڽŸ¸ÀÇ Ç÷¡±× ¼³Á¤À» °®´Â´Ù. sigactionÀ» È£ ÃâÇÏ´Â °ÍÀº ƯÁ¤ÇÑ ½Ã±×³¯ ¹øÈ£ÀÇ ¿µÇâÀ» ¹Þ°í, ´ç½ÅÀÌ ÁöÁ¤ÇÑ Ç÷¡±×µéÀº ¿ÀÁ÷ ƯÁ¤ÇÑ ½Ã±×³¯¿¡¸¸ Àû¿ëµÈ´Ù.
GNU C ¶óÀ̺귯¸®¿¡¼, signal·Î Çڵ鷯´Â ¸¸µå´Â °ÍÀº ´ç½ÅÀÌ siginterrupt·Î ¸¸µé¾ú´ø ¼³Á¤¿¡ ÀÇÁ¸ÇÑ °ªÀ» °®´Â SA_RESTART¸¦ Á¦¿ÜÇϰí´Â ¸ðµÎ 0À¸·Î Ç÷¡±×¸¦ ¼³Á¤ÇÑ´Ù. 21.5Àý [Interrupter Primitives] 293ÆäÀÌÁö¸¦ ÂüÁ¶Ç϶ó. ÀÌµé ¸ÅÅ©·ÎµéÀº Çì´õÆÄÀÏ `signal.h'¿¡ Á¤ÀǵǾî ÀÖ´Ù.
¸ÅÅ©·Î : int SA__NOCLDSTOP
ÀÌ Ç÷¡±×´Â SIGCHLD ½Ã±×³¯¿¡¼¸¸ À¯¿ëÇÏ´Ù. ±× Ç÷¡±×°¡ ¼³Á¤µÇ¾úÀ» ¶§, Á¾·áµÈ ÀÚ½Ä ÇÁ·Î¼¼½º ¸¦ À§ÇÑ ½Ã±×³¯Àº ¹è´ÞÇÏÁö¸¸, ¸ØÃß¾îÀÖ´Â ÀÚ½ÄÇÁ·Î¼¼½º¸¦ À§ÇÑ ½Ã±×³¯Àº ¹è´ÞÇÏÁö ¾Ê´Â´Ù. ¿ø·¡ SIGCHLD¸¦ À§ÇÑ µðÆúÆ® ¼³Á¤Àº Á¾·áµÈ ÀÚ½Ä ÇÁ·Î¼¼½º¿Í ¸ØÃá ÀÚ½Ä ÇÁ·Î¼¼½º µÑ´Ù¸¦ À§ÇÑ ½Ã±×³¯ À» ¹è´ÞÇÏ´Â °ÍÀÌ´Ù. ÀÌ Ç÷¡±×°¡ ¼³Á¤µÇ¸é SIGCHLD¸¦ Á¦¿ÜÇÑ ´Ù¸¥ ½Ã±×³¯¿¡´Â ¾Æ¹«·± ¿µÇâÀ» ÁÖ Áö ¾Ê´Â´Ù.
¸ÅÅ©·Î : int SA__ONSTACK
¸¸ÀÏ ¾î¶² ƯÁ¤ÇÑ ½Ã±×³¯ ¹øÈ£¸¦ À§Çؼ ÀÌ Ç÷¡±×°¡ ¼³Á¤µÇ¸é, ½Ã½ºÅÛÀº ±×·± Á¾·ùÀÇ ½Ã±×³¯ÀÌ ¹è ´ÞµÇ¾úÀ» ¶§ ½Ã±×³¯ ½ºÅÃÀ» »ç¿ëÇÑ´Ù. 21.9Àý [BSD Signal Handling] 306 ÆäÀÌÁö ÂüÁ¶.
¸ÅÅ©·Î : int SA__RESTART
ÀÌ Ç÷¡±×´Â ¾î¶² ±âº»µ¿ÀÛ (open, read, ¶Ç´Â write¿Í °°Àº)ÀÌ ÁøÇàµÇ°íÀÖ´Â µ¿¾È ¹è´ÞµÈ ½Ã±×³¯À» ¾î¶»°Ô ÇÒ°ÍÀÎÁö¸¦ Á¦¾îÇϰí, ½Ã±×³¯ Çڵ鷯´Â Á¤»óÀûÀ¸·Î ¸®ÅÏÇÑ´Ù. µÎ °³ÀÇ ¼±ÅñÇÀ» °¡Áø´Ù. ¶ó À̺귯¸® ÇÔ¼ö°¡ °è¼ÓµÉ ¼ö Àְųª, ¶Ç´Â ¿¡·¯ÄÚµå EINTRÀ» »ç¿ëÇØ¼ ½ÇÆÐ¸¦ ¸®ÅÏÇÒ ¼ö ÀÖ´Ù. ±×·¯ ÇÑ ¼±ÅÃÀº ¹è´ÞµÈ ƯÁ¤ÇÑ Á¾·ùÀÇ ½Ã±×³¯¿¡ µû¶ó¼ SA_RESTART¿¡ ÀÇÇØ Á¦¾îµÈ´Ù. ¸¸ÀÏ ±× Ç÷¡ ±×°¡ ¼³Á¤µÇ¸é, Çڵ鷯·ÎºÎÅÍÀÇ ¸®ÅÏÀº ¶óÀ̺귯¸® ÇÔ¼ö¸¦ ´Ù½Ã °è¼ÓÇÑ´Ù. ¸¸ÀÏ ±× Ç÷¡±×ÀÇ ¼³Á¤ÀÌ ÇØÁ¦µÇ¸é, Çڵ鷯·ÎºÎÅÍÀÇ ¸®ÅÏÀº ±× ÇÔ¼ö°¡ ½ÇÆÐÇϵµ·Ï ¸¸µç´Ù. 21.5Àý [Interrupted Primitives] 293ÆäÀÌÁö ÂüÁ¶.
21.3.6 Ãʱ⠽ñ׳¯ µ¿ÀÛµé.
»õ·Î¿î ÇÁ·Î¼¼½º°¡ ¸¸µé¾îÁú¶§(23.4Àý [Creating a Process] 326 ÆäÀÌÁö ÂüÁ¶.), ºÎ¸ð ÇÁ·Î¼¼½º·ÎºÎ ÅÍ ½Ã±×³¯µéÀÇ Ã³¸®¸¦ »ó¼Ó¹Þ´Â´Ù. ±×·¸Áö¸¸, ´ç½ÅÀÌ exec ÇÔ¼ö(23.5Àý [Executing a File] 327 ÆäÀÌ Áö ÂüÁ¶.)¸¦ »ç¿ëÇØ¼ »õ·Î¿î ÇÁ·Î¼¼½º À̹ÌÁö¸¦ ·ÎµåÇÒ ¶§, ¾î´À ½Ã±×³¯µéÀº ±×µéÀÇ ¿ø·¡ÀÇ µ¿ÀÛÀ¸ ·Î ȯ¿øÇϵµ·Ï SIG_DFLÀ» »ç¿ëÇØ¼ ´ç½Å ÀÚ½ÅÀÇ Çڵ鷯¸¦ Á¤ÀÇ ÇØ¾ß¸¸ ÇÑ´Ù. (¸¸ÀÏ ´ç½ÅÀÌ À̰Ϳ¡ ´ëÇØ¼ Á¶±Ý¸¸ »ý°¢ÇÑ´Ù¸é, À̰ÍÀ» ÀÌÇØÇÒ ¼ö ÀÖ´Ù; ¿ø·¡ÀÇ ÇÁ·Î±×·¥À¸·ÎºÎÅÍ ¿Â ó¸® ÇÔ¼öµéÀº ±× ÇÁ·Î±×·¥À» À§ÇÑ Á¤ÀÇÀ̰í, »õ·Î¿î ÇÁ·Î±×·¥ À̹ÌÁöÀÇ ÁÖ¼Ò °ø°£¿¡´Â ½ÉÁö¾î Á¸ÀçÇÏÁöµµ ¾Ê´Â´Ù.) ¹°·Ð, »õ·Î¿î ÇÁ·Î±×·¥Àº ÀÚ½ÅÀÇ Çڵ鷯¸¦ ¸¸µé ¼ö ÀÖ´Ù.
¾î¶² ÇÁ·Î±×·¥ÀÌ ½©¿¡ ÀÇÇØ ½ÇÇàµÉ ¶§, ½©Àº º¸Åë Àû´çÇÑ SIG_DFL ¶Ç´Â SIG_IGNÀ» »ç¿ëÇØ¼ ÀÚ ½Ä ÇÁ·Î¼¼½º¸¦ À§ÇÑ Ãʱ⵿ÀÛÀ» ¼³Á¤ÇÑ´Ù. ±×°ÍÀº ´ç½ÅÀÌ »õ·Î¿î ½Ã±×³¯ Çڵ鷯¸¦ ¸¸µé±âÀü¿¡ ½©ÀÌ SIG_IGNÀ¸·Î Ãʱ⵿ÀÛÀ» ÁغñÇÏÁö ¾ÊÀº°ÍÀÌ È®½ÇÇÑÁö üũÇÏ´Â °ÍÀº ÁÁÀº»ý°¢ÀÌ´Ù. ´ÙÀ½Àº ÇöÀç ¹«½ÃµÇÁö ¾Ê°í ÀÖ´Â SIGHUP ½Ã±×³¯À» À§ÇÑ Çڵ鷯¸¦ ¾î¶»°Ô ¸¸µå´ÂÁö¿¡ ´ëÇÑ ¿¹Á¦ÀÌ´Ù.
. . .
struct sigaction temp;
sigaction (SIGHUP, NULL, &temp);
if (temp.sa_handler != SIG_IGN)
{
temp.sa_handler = handle_sighup;
sigemptyset (&temp.sa_mask);
sigaction (SIGHUP, &temp, NULL);
}
21.4 ½Ã±×³¯ Çڵ鷯 Á¤ÀÇÇϱâ.
ÀÌÀýÀº signal À̳ª sigaction ÇÔ¼öµéÀ» »ç¿ëÇØ¼ ¸¸µé ¼ö ÀÖ´Â ½Ã±×³¯ Çڵ鷯 ÇÔ¼ö¸¦ ¾î¶»°Ô ¾µ°Í ÀÎÁö¿¡ ´ëÇØ¼ ¼³¸íÇϰí ÀÖ´Ù. ½Ã±×³¯ Çڵ鷯´Â ÇÁ·Î±×·¥ÀÇ ´Ù¸¥ ºÎºÐ°ú ÇÔ²² ÄÄÆÄÀÏÇÏ´Â ÇÔ¼öÀÏ »ÓÀÌ´Ù. Á÷Á¢ÀûÀ¸·Î ±× ÇÔ¼ö¸¦ ºÒ·¯³»´Â ´ë½Å¿¡, ½Ã±×³¯ÀÌ µµÂøÇßÀ» ¶§ ±× Çڵ鷯¸¦ È£ÃâÇϵµ·Ï ¿î¿µ üÁ¦¿¡°Ô ¾Ë¸®´Â signal À̳ª sigaction ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. À̰ÍÀÌ Çڵ鷯¸¦ ¸¸µå´Â °ÍÀÌ´Ù. 21.3Àý [Signal Actions] 279 ÆäÀÌÁö ÂüÁ¶. ´ÙÀ½Àº ´ç½ÅÀÌ ½Ã±×³¯ Çڵ鷯 ÇÔ¼ö¿¡¼ »ç¿ëÇÒ ¼ö ÀÖ´Â µÎ °³ÀÇ ±âº» ¹üÁÖµéÀÌ´Ù.
둁 ¾î¶² Àü¿ª µ¥ÀÌÅÍ ±¸Á¶Ã¼¿¡ ÀÇÇØ¼ µµÂøµÈ ½Ã±×³¯À» ±â·ÏÇØµÎ°í ±×´ÙÀ½ Á¤»óÀûÀÎ ¸®ÅÏÀ» ÇÏ´Â Çڵ鷯 ÇÔ¼ö¸¦ °¡Áú ¼ö ÀÖ´Ù.
둁 ÇÁ·Î±×·¥À» Á¾·á½ÃŰ°Å³ª ±× ½Ã±×³¯ÀÇ ¿øÀÎÀÌ µÈ »óȲÀ¸·ÎºÎÅÍ È¸º¹ÇÒ ¼ö ÀÖ´Â ÁöÁ¡À¸·Î Á¦¾î¸¦ ¿Å±â´Â Çڵ鷯 ÇÔ¼ö¸¦ °¡Áú ¼ö ÀÖ´Ù.
´ç½ÅÀÌ Çڵ鷯 ÇÔ¼ö¸¦ ÀÛ¼ºÇÒ ¶§ Çڵ鷯 ÇÔ¼ö´Â ºñµ¿±âÀûÀ¸·Î È£ÃâµÇ¾îÁú ¼ö Àֱ⠶§¹®¿¡ °¢º°ÇÑ ÁÖÀǰ¡ ÇÊ¿äÇÏ´Ù. Áï, Çڵ鷯ÇÔ¼ö´Â ¿¹ÃøÇÒ¼ö¾øÀÌ, ÇÁ·Î±×·¥ÀÇ ¾î´ÀÁöÁ¡¿¡¼µçÁö È£ÃâµÇ¾îÁú °ÍÀÌ´Ù. ¸¸ÀÏ ¸Å¿ì ªÀº °£°ÝÀ» µÎ°í µÎ °³ÀÇ ½Ã±×³¯ÀÌ µµÂøÇÑ´Ù¸é, ÇÑ °³ÀÇ Çڵ鷯´Â ´Ù¸¥ Çڵ鷯 ¾È¿¡¼ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ÀÌÀýÀº ´ç½ÅÀÇ Çڵ鷯´Â ¹«¾ùÀ» Çϰí, ¹«¾ùÀ» ÇÇÇØ¾ß ÇÏ´ÂÁö¸¦ ¼³¸íÇÑ´Ù.
21.4.1 ¸®ÅÏÇÏ´Â ½Ã±×³¯ Çڵ鷯.
Á¤»óÀûÀÎ ¸®ÅÏÀ» ÇÏ´Â Çڵ鷯´Â SIGALRM °ú ÀÔ/Ãâ·Â°ú ½Ã±×³¯À» »ç¿ëÇÑ ÇÁ·Î¼¼½º°£ Åë½Å°ú °°Àº ½Ã±×³¯¿¡ º¸Åë »ç¿ëµÇ¾îÁø´Ù. ±×·¯³ª SIGINT¸¦ À§ÇÑ Çڵ鷯´Â °¡´ÉÇÑ ½Ã°£¿¡ ÇÁ·Î±×·¥ÀÌ ºÐ±âÇϵµ ·Ï Ç÷¡±×¸¦ ¼³Á¤ÇÑ ÈÄ¿¡ Á¤»óÀûÀ¸·Î ¸®ÅÏÇÑ´Ù.
ÇÁ·Î±×·¥ ¿¡·¯ ½Ã±×³¯À» À§ÇÑ Çڵ鷯·ÎºÎÅÍ Á¤»óÀûÀÎ ¸®ÅÏÀ» Çϵµ·Ï ÇÏ´Â °ÍÀº ¾ÈÀüÇÏÁö ¾Ê´Ù, ¿Ö ³ÄÇϸé Çڵ鷯 ÇÔ¼ö°¡ ¸®ÅÏÇÒ¶§ ÇÁ·Î±×·¥ÀÇ µ¿ÀÛÀº ÇÁ·Î±×·¥ ¿¡·¯ ÈÄ¿¡ ¹«¾ùÀ» ÇÒ°ÍÀÎÁö Á¤ÀǵÇÁö ¾Ê¾Ò±â ¶§¹®ÀÌ´Ù. 21.2.1Àý [Program Erroe Signals] 273 ÆäÀÌÁö ÂüÁ¶.
Á¤»óÀûÀ¸·Î ¸®ÅÏÇÏ´Â Çڵ鷯µéÀº ¾î¶² Àü¿ª º¯¼ö¸¦ °»½ÅÇØ¾ß¸¸ ÇÑ´Ù. ÀüÇüÀûÀ¸·Î, ±× º¯¼ö´Â Á¤»ó ÀûÀ¸·Î ÀÛµ¿ÇÏ´Â µ¿¾È¿¡ ÇÁ·Î±×·¥¿¡ ÀÇÇØ ÁÖ±âÀûÀ¸·Î ½ÃÇèµÇ´Â °ÍÀÌ´Ù. µ¥ÀÌÅÍŸÀÔÀº 21.4.7Àý [Atomic Data Access]292 ÆäÀÌÁö¿¡¼ ¼³¸íµÈ sig_atomic_t°¡ µÈ´Ù.
´ÙÀ½Àº ÇÑ °³ÀÇ ÇÁ·Î±×·¥°ú °°Àº °£´ÜÇÑ ¿¹Á¦ÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº SIGALRM ½Ã±×³¯ÀÌ µµÂøÇÑ °ÍÀ» ¹ß°ßÇÒ¶§±îÁö ·çÇÁÀÇ ¸öü¸¦ ½ÇÇàÇÑ´Ù. ÀÌ ±â¼úÀº ½Ã±×³¯ÀÌ µµÂøÇÏ¸é ±× ·çÇÁ¸¦ ºÐ±âÇϱâ Àü¿¡ ¾î¶² µ¿ÀÛÀ» ¿Ï¼ºÇϵµ·Ï ÁøÇà°úÁ¤¿¡¼ »óÈ£ÀÛ¿ëÀ» Çã¿ëÇϱ⠶§¹®¿¡ À¯¿ëÇÏ´Ù.
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
/* ÀÌ Ç÷¡±×´Â ¸ÞÀÎ ·çÇÁÀÇ Á¾·á¸¦ Á¦¾îÇÑ´Ù. */
volatile sig_atomic_t keep_going = 1;
/* ½Ã±×³¯ Çڵ鷯´Â ´ÜÁö ±× Ç÷¡±×¸¦ ¼Ò°ÅÇÏ°í ±× ÀÚü¸¦ ´Ù½Ã °¡´ÉÇÏ°Ô ÇÑ´Ù. */
void
catch_alarm (int sig)
{
keep_going = 0;
signal (sig, catch_alarm);
}
void
do_stuff (void)
{
puts ("Doing stuff while waiting for alarm....");
}
int
main (void)
{
/* SIGALRM ½Ã±×³¯À» À§ÇÑ Çڵ鷯¸¦ ¸¸µç´Ù. */
signal (SIGALRM, catch_alarm);
/* Àá½Ãµ¿¾È ¾Ë¶÷ÀÌ ¸ØÃßµµ·Ï ¼³Á¤ÇÑ´Ù. */
alarm (2);
/* Á¾·áÇÒ¶§¸¦ ¾Ë±âÀ§Çؼ while¿¡¼ Ç÷¡±×¸¦ üũÇÑ´Ù. */
while (keep_going)
do_stuff ();
return EXIT_SUCCESS;
}
21.4.2 ÇÁ·Î¼¼½º¸¦ Á¾·á½ÃŰ´Â Çڵ鷯.
ÇÁ·Î¼¼½º¸¦ Á¾·á½ÃŰ´Â Çڵ鷯 ÇÔ¼öµéÀº ÀüÇüÀûÀ¸·Î ¼Ò°Å ¸í·ÉÀ̳ª ÇÁ·Î±×·¥ ¿¡·¯ ½Ã±×³¯·ÎºÎÅÍÀÇ º¹±¸¿Í ÀÎÅÍ·´Æ®°¡ ¿øÀÎÀÌ µÈ°÷¿¡ »ç¿ëµÈ´Ù. ÇÁ·Î¼¼½º¸¦ Á¾·áÇϵµ·Ï ÇÏ´Â Çڵ鷯¸¦ ¸¸µå´Â °¡Àå ±ú ²ýÇÑ ¹æ¹ýÀº Çڵ鷯 ½ÇÇàÀÇ Ã¹ ¹øÂ°¿¡¼ °°Àº ½Ã±×³¯ÀÌ ¹ß»ýµÇµµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ´ÙÀ½°ú °°ÀÌ.
volatile sig_atomic_t fatal_error_in_progress = 0;
void
fatal_error_signal (int sig)
{
/* ÀÌ Çڵ鷯´Â ¿©·¯°³ÀÇ ½Ã±×³¯¿¡ ´ëÇÏ¿© ó¸®ÇÏ´Â °ÍÀ̹ǷÎ, ¾î¶² Á¾·ùÀÇ ½Ã±×³¯ÀÌ ¹è´ÞµÉ¶§¸¶´Ù ¹Ýº¹ÀûÀ¸·Î Çڵ鷯°¡ ºÒ¸®¿öÁú °ÍÀÌ´Ù. ±×°ÍÀ» ±â¾ïÇϵµ·Ï Á¤Àûº¯¼ö¸¦ »ç¿ëÇ϶ó. */
if (fatal_error_in_progress)
raise (sig);
fatal_error_in_progress = 1;
/* ÀÌÁ¦ µ¿ÀÛµéÀ» Á¤¸®ÇÏÀÚ :
- Å͹̳¯ ¸ðµå¸¦ Àç¼³Á¤ÇÑ´Ù.
- ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ killÇÑ´Ù.(À¸~~ ½Ò¹úÇØ..)
- ·Ï ÆÄÀϵéÀ» Á¦°ÅÇÏÀÚ. */
. . .
/* ÀÌÁ¦ ½Ã±×³¯À» ´Ù½Ã ÀÏÀ¸Å°ÀÚ. ±×µ¿¾È ½Ã±×³¯Àº ºí·ÏµÇ¾îÁ® ÀÖ¾ú°í, ÀÌÁ¦ µðÆúÆ® 󸮷νá, ÇÁ·Î ¼¼½º¸¦ Á¾·áÇϵµ·Ï ÇÏ´Â ±× ½Ã±×³¯À» ¹ÞÀ» °ÍÀÌ´Ù. ¿ì¸®´Â ´ÜÁö exit ³ª abort¸¸À» È£ÃâÇÒ ¼öµµ ÀÖ Áö¸¸, ½Ã±×³¯À» Àç¹ß»ý½Ã۸é ÇÁ·Î¼¼½ºÀÇ Á¤È®ÇÑ »óȲÀ¸·Î ¸®ÅÏÀ» ¼³Á¤ÇÑ´Ù. */
raise (sig);
}
21.4.3 Çڵ鷯 ¾È¿¡¼ ºñÁö¿ª Á¦¾î À̵¿.
´ç½ÅÀº setjmp ¿Í longjmp ±â´ÉÀ» »ç¿ëÇØ¼ ½Ã±×³¯ Çڵ鷯ÀÇ ¿ÜºÎ·Î Á¦¾îÀÇ ºñÁö¿ª À̵¿À» ÇÒ ¼ö ÀÖ´Ù( 20Àå [Non-Local Exits] 267 ÆäÀÌÁöÂüÁ¶.) Çڵ鷯°¡ ºñÁö¿ª Á¦¾î À̵¿À» ÇÒ ¶§, ½ÇÇàÁß¿¡ ÀÖ´ø ÇÁ·Î±×·¥ÀÇ ±×ºÎºÐÀº °è¼ÓµÇÁö ¾ÊÀ» °ÍÀÌ´Ù. ¸¸ÀÏ ÇÁ·Î±×·¥ÀÇ ±× ºÎºÐÀÌ Áß¿äÇÑ µ¥ÀÌÅÍ ±¸Á¶Ã¼¸¦ °»½ÅÁß¿¡ ÀÖ¾ú´Ù¸é, ±× µ¥ÀÌÅÍ ±¸Á¶Ã¼´Â ¿©ÀüÈ÷ ¿Ïº®ÇÏ°Ô Ã³¸®µÇÁö ¸øÇÑ »óÅ·Π³²°ÔµÉ °ÍÀÌ´Ù. ÇÁ ·Î±×·¥ÀÌ Á¾·áµÇÁö ¾Ê´Â´Ù¸é, À§¿Í °°Àº ¹®Á¦´Â ³ªÁß¿¡ ¹ß°ßµÉÁöµµ ¸ð¸¥´Ù.
ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇÇÇϱâ À§ÇÑ µÎ °³ÀÇ ¹æ¹ýÀÌ Á¸ÀçÇÑ´Ù. ÇѰ¡Áö´Â Áß¿äÇÑ Å×ÀÌŸ¸¦ °»½ÅÇÏ´Â ÇÁ·Î±× ·¥ ºÎºÐÀ» À§Çؼ´Â ½Ã±×³¯À» ºí·ÏÇÏ´Â °ÍÀÌ´Ù. ºí·ÏµÈ ½Ã±×³¯Àº ±× ºí·ÏÀÌ ÇØÁ¦µÈÈÄ¿¡ ¹è´ÞµÇ¾îÁö °í, ±×¶§´Â ÀÌ¹Ì Áß¿äÇÑ µ¥ÀÌÅÍ °»½ÅÀº ³¡³ »óŰ¡ µÈ´Ù. 21.7Àý [Blocking Signals] 298 ÆäÀÌÁöÂü Á¶. ´Ù¸¥¹æ¹ýÀº ½Ã±×³¯ Çڵ鷯 ¾È¿¡¼ Áß¿äÇÑ µ¥ÀÌÅÍÀÇ ±¸Á¶Ã¼µéÀ» Àç-ÃʱâÈ Çϰųª, ±×µéÀÇ °ªÀ» ¸ð¼øÀÌ ¾øµµ·Ï ¸¸µå´Â °ÍÀÌ´Ù. ´ÙÀ½Àº ÇÑ °³ÀÇ Àü¿ªº¯¼öÀÇ ÀçÃʱâȸ¦ º¸¿©ÁÖ´Â °³·«ÀûÀÎ ¿¹Á¦ÀÌ´Ù.
#include <signal.h>
#include <setjmp.h>
jmp_buf return_to_top_level;
volatile sig_atomic_t waiting_for_input;
void
handle_sigint (int signum)
{
/* ¿ì¸®´Â ½Ã±×³¯ÀÌ µµÂøÇßÀ»¶§´Â ÀÔ·ÂÀ» ¹Þ±âÀ§Çؼ ±â´Ù¸®°ÚÁö¸¸, Á¦¾î¸¦ ¿Å±æ¶§´Â ´õ ÀÌ»ó ±â´Ù ¸®Áö ¾Ê´Â´Ù. */
waiting_for_input = 0;
longjmp (return_to_top_level, 1);
}
int
main (void)
{
. . .
signal (SIGINT, sigint_handler);
. . .
while (1) {
prepare_for_command ();
if (setjmp (return_to_top_level) == 0)
read_and_execute_command();
}
}
/* À̰ÍÀÌ ¿©·¯ ¸í·É¹®¿¡¼ »ç¿ëµÇ´Â ¼ºê·çƾÀ̶ó°í »ý°¢ÇÏÀÚ. */
char *
read_data ()
{
if (input_from_terminal) {
waiting_for_input = 1;
. . .
waiting_for_input = 0;
} else {
. . .
}
}
21.4.4 Çڵ鷯°¡ ½ÇÇàµÇ°í ÀÖ´Â µ¿¾È µµÂøÇÑ ½Ã±×³¯µé.
½Ã±×³¯ Çڵ鷯 ÇÔ¼ö°¡ ½ÇÇàµÇ°í ÀÖÀ» ¶§ µµÂøÇÑ ´Ù¸¥ ½Ã±×³¯ÀÌ ÀÖ´Ù¸é ¹«½¼ ÀÏÀÌ ¹ß»ýÇÒ±î? ÇÑ Æ¯ Á¤ÇÑ ½Ã±×³¯À» À§ÇÑ Çڵ鷯°¡ È£ÃâµÇ¾úÀ» ¶§, Çڵ鷯°¡ ¸®ÅÏÇÒ ¶§ ±îÁö ±× ½Ã±×³¯Àº º¸Åë ºí·ÏµÈ´Ù. ¸¸ÀÏ °°Àº Á¾·ùÀÇ µÎ °³ÀÇ ½Ã±×³¯ÀÌ ¼·Î °¡±î¿î ½Ã°£¿¡ µµÂøÇÑ´Ù¸é, µÎ ¹øÂ°°ÍÀº ù ¹øÂ°°ÍÀÌ Ã³¸® µÉ¶§±îÁö ±×³É º¸À¯Çϰí ÀÖÀ» °ÍÀÌ´Ù. ( ¸¸ÀÏ ´ç½ÅÀÌ ÀÌ·¯ÇÑ ÇüÅÂÀÇ ´õ ¸¹Àº ½Ã±×³¯ÀÌ µµÂøÇϵµ·Ï Çã¿ëÇϱ⸦ ¿øÇÑ´Ù¸é, Çڵ鷯´Â sigprocmask¸¦ »ç¿ëÇØ¼ ½Ã±×³¯À» ¸í¹éÇÏ°Ô ºí·ÏÀ» ÇØÁ¦ÇÒ ¼ö ÀÖ´Ù; 21.7.3Àý [Process Signal Mask] 300ÆäÀÌÁö ÂüÁ¶.)
±×·¸Áö¸¸, ´ç½ÅÀÇ Çڵ鷯´Â ´Ù¸¥ Á¾·ùÀÇ ½Ã±×³¯ÀÇ ¹è´Þ¿¡ ÀÇÇØ¼´Â ¿©ÀüÈ÷ ÀÎÅÍ·´Æ®µÇ¾îÁú ¼ö ÀÖ´Ù. À̰ÍÀ» ÇÇÇϱâ À§Çؼ, ´ç½ÅÀº sigaction¿¡ Àμö·Î½á »ç¿ëÇÏ´Â action ±¸Á¶Ã¼ÀÇ sa_mask ¸â¹ö¸¦ »ç¿ë ÇØ¼ Çڵ鷯°¡ ½ÇÇàµÇ´Â µ¿¾È ºí·ÏµÇ¾îÁú ½Ã±×³¯À» ¸í¹éÇÏ°Ô ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ±×µé ½Ã±×³¯Àº È£Ãâ µÈ Çڵ鷯¸¦ À§ÇÑ ½Ã±×³¯¿¡ ´õÇØÁ® ÀÖ°í, ´Ù¸¥ ½Ã±×³¯µéÀº º¸Åë ÇÁ·Î¼¼½º¿¡ ÀÇÇØ¼ ºí·ÏµÇ¾îÁø´Ù. 21.7.5Àý [Blocking for Handler] 301 ÆäÀÌÁö ÂüÁ¶.
À̽ļº ³ëÆ® : ¸¸ÀÏ ´ç½ÅÀÇ ÇÁ·Î±×·¥ÀÌ ¿ÏÀüÈ÷ System V Unix»ó¿¡¼ ÀÛ¾÷Çϱ⸦ ¿øÇÒ ¶§, ºñµ¿±â ÀûÀÎ ¹ß»ýÀÌ ¿¹»óµÇ´Â ½Ã±×³¯À» À§ÇÑ Çڵ鷯¸¦ ¸¸µé·Á¸é Ç×»ó sigactionÀ» »ç¿ëÇ϶ó. ´Ù¸¥ ½Ã½ºÅÛ ¿¡¼´Â, Çڵ鷯¿¡¼ ÇÏ´Â ½Ã±×³¯ÀÇ Ã³¸®´Â SIG_DFL·Î ½Ã±×³¯ÀÌ °¡Áø ¿ø·¡ÀÇ µ¿ÀÛÀ¸·Î µÇµ¹·ÁÁöµµ·Ï ¸¸µé¾îÁ®ÀÖ°í, Çڵ鷯´Â ½ÇÇàµÉ¶§¸¶´Ù ±× ÀÚü¸¦ ´Ù½Ã ¸¸µé¾î¾ß¸¸ ÇÑ´Ù. ÀÌ °ÍÀº ½ÇÁ¦·Î ½Ã±×³¯ÀÌ ¿¬¼ÓÀûÀ¸·Î µµÂøÇÒ¼ö ¾øÀ» ¶§ ÀÛ¾÷Çϱâ´Â ºÒÆíÇÏ´Ù. ÇÏÁö¸¸ ´Ù¸¥ ½Ã±×³¯ÀÌ Áï½Ã µµÂøÇÒ ¼ö ÀÖ´Ù ¸é, ±×°ÍÀº ´Ù½Ã Çڵ鷯¸¦ ´Ù½Ã Á¤ÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ±×·¯¸é µÎ ¹øÂ° ½Ã±×³¯Àº ÇÁ·Î¼¼½º¸¦ Á¾·á½Ã Ű´Â, µðÆúÆ® 󸮷Π¹Þ°ÔµÉ °ÍÀÌ´Ù.
21.4.5 ÇѰ¡Áö·Î ÇÕº´ÇÑ ¼·Î ¹ÐÁ¢ÇÑ ½Ã±×³¯µé.
¸¸ÀÏ ´ç½ÅÀÇ ½Ã±×³¯ Çڵ鷯°¡ ÀüÇô È£ÃâµÉ¸¸ÇÑ ±âȸµµ °®±âÀü¿¡, ´ç½ÅÀÇ ÇÁ·Î¼¼½º¿¡ °°Àº Á¾·ùÀÇ ½Ã±×³¯ÀÌ ¿©·¯°³ ¹è´ÞµÇ¾ú´Ù¸é, ±× Çڵ鷯´Â ¿ÀÁ÷ ÇÑ °³ÀÇ ½Ã±×³¯ÀÌ µµÂøÇѰÍó·³ È£ÃâµÇ¾îÁú °ÍÀÌ ´Ù. ½ÇÁ¦·Î, ±× ½Ã±×³¯µéÀº ÇÑ °³·Î ÇÕº´ÇÑ´Ù. ÀÌ »óȲÀº ½Ã±×³¯ÀÌ ºí·ÏµÇ¾úÀ»¶§³ª, ¶Ç´Â ¸ÖƼÇÁ·Î¼¼ ½Ì ȯ°æ¿¡¼ ½Ã±×³¯ÀÌ µµÂøÇߴµ¥ ½Ã½ºÅÛÀÌ ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ½ÇÇà ¶§¹®¿¡ ¹Ù»Ü ¶§¹ß»ýÇÒ ¼ö ÀÖ´Ù. À̰ÍÀÌ ÀǹÌÇÏ´Â °ÍÀº, ¿¹¸¦µé¾î, ´ç½ÅÀº ¹ß»ýÇÑ ½Ã±×³¯ÀÇ °³¼ö¸¦ ¼¼´Â ½Ã±×³¯ Çڵ鷯ÀÇ »ç¿ëÀ» ½Å·Ú ÇÒ ¼ö ¾ø´Ù. ¿À·ÎÁö ´ç½ÅÀÌ ±¸ºÐÇÒ ¼ö ÀÖ´Â °ÍÀº °ú°ÅÀÇ ÁÖ¾îÁø ½Ã°£µ¿¾È¿¡ Àû¾îµµ ÇÑ °³ÀÇ ½Ã±×³¯ ÀÌ µµÂøÇß´ÂÁö, ¶Ç´Â µµÂøÇÏÁö ¾Ê¾Ò´Â Áö¸¦ ±¸ºÐÇÏ´Â °Í¸¸À» ½Å·ÚÇÒ ¼ö ÀÖ´Ù.
´ÙÀ½Àº ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¹ß»ý½ÃŲ SIGCHLDÀÇ °³¼ö¿Í´Â °°Áö ¾ÊÀ»Áöµµ ¸ð¸£´Â SIGCHLD ½Ã±×³¯ ÀÇ °³¼ö¸¦ ½ÇÁ¦Ã³·³ ´ëÄ¡ÇÏ´Â Çڵ鷯ÀÇ ¿¹Á¦ÀÌ´Ù. ±×°ÍÀº ÇÁ·Î±×·¥ÀÌ ´ÙÀ½Ã³·³ ±¸Á¶Ã¼¸¦ ¿¬°áÇÏ¿© ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ ¸ðµÎ¸¦ ÃßÀûÇϰí ÀÖ´Ù°í °¡Á¤ÇÑ´Ù.
structprocess
{
struct process *next;
/* ÀÚ½Ä ÇÁ·Î¼¼¼¼ÀÇ ÇÁ·Î¼¼½º ID */
int pid;
/* ÀÚ½Ä ÇÁ·Î¼¼½º°¡ Ãâ·ÂÀ» ÇÏ´Â ÆÄÀÌÇÁ³ª °¡»ó Å͹̳¯ÀÇ ±â¼úÀÚ */
int input_descriptor;
/* ¸¸ÀÏ ÀÌ ÇÁ·Î¼¼½º°¡ ¸ØÃ߰ųª Á¾·áµÈ´Ù¸é 0ÀÌ ¾Æ´Ï´Ù. */
sig_atomic_t have_status;
/* ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ »óȲ; ½ÇÇàÁßÀ̸é 0, ±×·¸Áö ¾ÊÀ¸¸é ±× status´Â waitpid·ÎºÎÅÍÀÇ °ªÀÌ´Ù. */
int status;
};
struct process *process_list;
´ÙÀ½ ¿¹Á¦´Â °ú°ÅÀÇ ¾î¶² ½Ã°£µ¿¾È¿¡ ½Ã±×³¯ÀÌ µµÂøÇß´ÂÁö¸¦ ÁöÀûÇÏ´Â Ç÷¡¸¦ »ç¿ëÇÑ´Ù_±×¶§¸¶´Ù ÇÁ·Î±×·¥Àº ¸¶Áö¸·¿¡ ±× Ç÷¡±×¸¦ 0À¸·Î ¼Ò°ÅÇÑ´Ù.
/* 0ÀÌ ¾Æ´Ñ°ªÀº process_listÀÇ Ç׸ñ¿¡¼ »óȲÀÌ º¯È¯µÈ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ¹ß°ßÇßÀ½À» ÀǹÌÇÑ´Ù. */
int process_status_change;
´ÙÀ½Àº Çڵ鷯 ÀÚüÀÌ´Ù.
void sigchld_handler (int signo)
{
int old_errno = errno;
while (1) {
register int pid;
int w;
struct process *p;
/* Á¤ÇØÁø °á°ú¸¦ ¾òÀ»¶§±îÁö »óȲÀ» ¹°¾îº¸¾Æ¶ó */
do{
errno = 0;
pid = waitpid (WAIT_ANY, &w, WNOHANG |
WUNTRACED);
}while (pid <= 0 && errno == EINTR);
if (pid <= 0 ) {
/* ½ÇÆÐÀÇ ½ÇÁ¦ Àǹ̴ ´õ ÀÌ»ó ¸ØÃ߰ųª Á¾·áµÉ ÀÚ½ÄÇÁ·Î¼¼½º°¡ ¾øÀ½À» ÀǹÌÇϰí, ±×·¡¼ ¸®ÅÏÇÑ´Ù. */
errno = old_errno;
return;
}
/* ¿ì¸®¿¡°Ô ½ÅÈ£¸¦ º¸³Â´ø ÇÁ·Î¼¼½º¸¦ ã¾Æ¼, ±× »óȲÀ» ±â·ÏÇ϶ó */
for (p = process_list; p; p = p->next)
if (p->pid == pid) {
p->status = w;
/* º¸·ÁÇÏ´Â µ¥ÀÌÅ͸¦ °¡Áø »óȲ Çʵ带 ÁöÀûÇ϶ó. ¿ì¸®´Â ±×°ÍÀÌ ÀúÀåµÈ ÈÄ¿¡ À̰ÍÀ» ÇÑ´Ù. */
p->have_status = 1;
/* ¸¸ÀÏ ÇÁ·Î¼¼½º°¡ Á¾·áµÇ¾ú´Ù¸é, Ãâ·ÂÀ» À§ÇÑ ±â´Ù¸²À» ¸ØÃß¾î¶ó */
if (WIFSIGNALED (w) || WIFEXITED (w))
if (p->input_descriptor)
FD_CLR (p->input_descriptor, &input_wait_mask);
/* ÇÁ·Î±×·¥Àº process_list ¾È¿¡ ¾î¶² »õ·Î¿î °ÍÀÌ ÀÖ´ÂÁö ¾Ë¾Æ º¸±â À§Çؼ ÁÖ¾îÁø ½Ã°£µ¿¾È¿¡ ÀÌ Ç÷¡±×¸¦ üũÇÒ °ÍÀÌ´Ù.*/
++process_status_change;
}
/* ¿ì¸®¿¡°Ô ¸»ÇÒ ¹«¾ð°¡¸¦ °¡Áø ¸ðµç ÇÁ·Î¼¼½ºµéÀ» ó¸® Çϵµ·Ï ·çÇÁ¸¦ µ¹·Á¶ó */
}
}
´ÙÀ½Àº process_status_change Ç÷¡±×¸¦ üũÇϱâ À§ÇÑ Àû´çÇÑ ¹æ¹ýÀÌ´Ù.
if (process_status_change) {
struct process *p;
process_status_change = 0;
for (p = process_list; p; p = p->next)
if (p->have_status) {
. . . Examine p->status . . .
}
}
¸®½ºÆ®¸¦ ½ÃÇèÇϱâ Àü¿¡ Ç÷¡±×¸¦ ¼Ò°ÅÇÏ´Â °ÍÀº Ä¡¸íÀûÀÌ´Ù; ±×·¸Áö ¾Ê°í, ¸¸ÀÏ Ç÷¡±×°¡ ¼Ò°ÅµÇ ±â Àü°ú, ÇÁ·Î¼¼½º ¸®½ºÆ®ÀÇ Àû´çÇÑ ¿ä¼Ò°¡ üũµÈÈÄ¿¡ ½Ã±×³¯ÀÌ ¹è´ÞµÈ´Ù¸é, ´ÙÀ½ µµÂøÇÑ ½Ã±×³¯ÀÌ ´Ù½Ã ±× Ç÷¡±×¸¦ ¼³Á¤Çϱâ Àü±îÁö´Â ±× »óȲº¯È¸¦ ¾Ë¾ÆÂ÷¸± ¼ö ¾ø´Ù. ´ç½ÅÀº ¹°·Ð ±×¸®½ºÆ®¸¦ Á¶ »çÇÏ´Â µ¿¾È ½Ã±×³¯À» ºí·ÏÇÔÀ¸·Î½á ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇÇÇÒ ¼ö´Â ÀÖÁö¸¸, ¿Ã¹Ù¸¥ ¼ø¼·Î ÀϵéÀ» ó¸®ÇÏ ´Â °ÍÀÌ Á¤È®ÇÔÀ» º¸ÁõÇϱ⿡´Â Á»´õ ÁÁÀº ¹æ¹ýÀÌ´Ù.
ÇÁ·Î¼¼½º »óȲÀ» üũÇÏ´Â ·çÇÁ°¡ ±× »óȲÀÌ À¯¿ëÇÏ°Ô ÀúÀåµÇ¾îÁ³À½ÀÌ È®Àεɶ§±îÁö p->status¸¦ Á¶»çÇÏ´Â °ÍÀ» ÇÇÇÑ´Ù. À̰ÍÀº status°¡ ¾ï¼¼½º µÇ°í ÀÖ´Â µµÁß¿¡ º¯ÈµÉ ¼ö ¾øÀ½À» È®½ÇÇÏ°Ô ÇÑ´Ù. ÀÏ´Ü p->have_status°¡ ¼³Á¤µÇ¸é, ±×°ÍÀº ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¸ØÃ߰ųª Á¾·áÇßÀ½À» ÀǹÌÇϰí, ±× ¾î´À °æ¿ì¿¡µµ, ÇÁ·Î±×·¥ÀÌ ÁÖ¸ñÇϰí ÀÖ´Â µ¿¾È¿¡ ´Ù½Ã ¸ØÃ߰ųª Á¾·áÇÒ ¼ö¾ø´Ù. º¯¼ö¸¦ ¾ï¼¼½ºÇϰí ÀÖ´Â µ¿¾È¿¡ ÀÎÅÍ·´¼Ç(interruptions)À» ¸ð¹æÇϱ⿡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸´Â 21.4.7.3Àý [Atomic Usage]293 Æä ÀÌÁö¸¦ ÂüÁ¶Ç϶ó.
´ÙÀ½Àº ´ç½ÅÀÌ Ã¼Å©Çß´ø ¸¶Áö¸· ½Ã°£ÀÌÈÄ Çڵ鷯°¡ ½ÇÇàµÇ¾ú´ÂÁö¸¦ ½ÃÇè ÇÒ ¼ö ÀÖ´Â ´Ù¸¥¹æ¹ýÀÌ´Ù. ÀÌ ±â¼úÀº Çڵ鷯ÀÇ ¿ÜºÎ¿¡¼ °áÄÚ º¯ÈµÇÁö ¾ÊÀ» Ä«¿îÅÍ·Î »ç¿ëÇÑ´Ù. ºóµµ¼ö(count)¸¦ ¼Ò°ÅÇÏ´Â ´ë½Å¿¡, ÇÁ·Î±×·¥Àº ÀüÀÇ °ªÀ» ±â¾ïÇϰí ÀÖ´Ù°¡ ±× ÀÌÈÄ¿¡ ±× °ªÀÌ º¯ÈµÇ¾ú´ÂÁö¸¦ º¸¿©ÁØ´Ù. ÀÌ ¹æ ¹ýÀÌ À¯¸®ÇÑÁ¡Àº ÇÁ·Î±×·¥ÀÇ ´Ù¸¥ ºÎºÐµéÀ» µ¶¸²ÀûÀ¸·Î üũÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ¸·Î, °¢°¢ÀÇ ºÎºÐÀº ±× ºÎºÐÀ» ¸¶Áö¸·À¸·Î üũÇÑ ÀÌÈÄ¿¡ ½Ã±×³¯ÀÌ ÀÖ¾ú´ÂÁö¸¦ üũÇÑ´Ù.
sig_atomic_t process_status_change;
sig_atomic_t last_process_status_change;
. . .
{
sig_atomic_t prev = last_process_status_change;
last_process_status_change = process_status_change;
if (last_process_status_change != prev) {
struct process *p;
for (p = process_list; p; p = p->next)
if (p->have_status) {
. . . Examine p->status . . .
}
}
}
21.4.6 ½Ã±×³¯ Çڵ鸵 °ú ÀçÁøÀÔ ºÒ°¡ ÇÔ¼öµé.
** ¿ªÀÚÁÖ : ÀçÁøÀÔ(reentrant) : ¾î¶² ¸ðµâÀ» ÀçÁøÀÔÀÌ °¡´ÉÇÏ´Ù¶ó°í ÇÒ ¶§, ±×°ÍÀº µ¿½Ã¿¡ µÎ °³ ÀÌ»óÀÇ ÇÁ·Î±×·¥¿¡ ÀÇÇÏ¿© °øÀ¯µÉ ¼ö ÀÖ´Â ¸ðµâÀ» ¸»ÇÑ´Ù. ÀÌ·¯ÇÑ ¸ðµâÀº ½ÇÇà Áß¿¡ ÀÚ½ÅÀÇ ÄÚµå ¶Ç´Â µ¥ÀÌÅÍ ¿µ¿ªÀ» º¯°æ½ÃŰÁö ¾Ê¾Æ¾ß ÇÕ´Ï´Ù.
Çڵ鷯 ÇÔ¼öµéÀº º¸Åë ¸¹Àº ÀÏÀ» ÇÏÁö´Â ¾Ê´Â´Ù. Çڵ鷯 ÇÔ¼ö¿¡°Ô´Â ÇÁ·Î±×·¥ÀÌ Á¤±âÀûÀ¸·Î üũ ÇÏ´Â ¿ÜºÎº¯¼ö¸¦ ¼³Á¤ÇÏ´ÂÀÏ À̿ܿ¡´Â ¾Æ¹«°Íµµ ÇÏÁö ¾Ê°ÔÇϰí, ´Ù¸¥ Áß¿äÇÑ ÀϵéÀº ÇÁ·Î±×·¥¿¡°Ô ¸Ã±â´Â °ÍÀÌ ÁÁ´Ù. À̰ÍÀº Çڵ鷯°¡ ¿¹ÃøÇÒ ¼ö ¾ø´Â ½Ã°£¿¡_½Ã½ºÅÛ È£ÃâµµÁß, ¶Ç´Â ´ÙÁß ¸í·ÉÀ» ¿ä ±¸ÇÏ´Â C¿¬»êÀÚÀÇ ½ÃÀÛ°ú ³¡ »çÀÌ¿¡_ºñµ¿±âÀûÀ¸·Î È£ÃâµÉ ¼ö Àֱ⠶§¹®ÀÌ´Ù.
µ¥ÀÌÅÍ ±¸Á¶Ã¼°¡ 󸮵ǰí ÀÖ´Â µ¿¾È Çڵ鷯 ÇÔ¼ö°¡ È£ÃâµÇ¸é µ¥ÀÌÅÍ ±¸Á¶Ã¼ÀÇ »óȲÀº ºÒÀÏÄ¡ÇÏ°Ô µÉ °ÍÀÌ´Ù. ½ÉÁö¾î ÇÑ °³ÀÇ int Çü º¯¼ö¿¡¼ ´Ù¸¥ º¯¼ö·Î °ªÀ» º¹»çÇÏ´Â °Í Á¶Â÷µµ ´ëºÎºÐÀÇ ±â°è¿¡ ¼ µÎ °³ÀÇ ¸í·É¾î¸¦ ÃëÇÒ ¼öµµ ÀÖ´Ù. À̰ÍÀº ´ç½ÅÀÌ ½Ã±×³¯ Çڵ鷯¿¡¼ ¹«¾ð°¡¸¦ ÇÒ ¶§ ¸¹Àº ÁÖÀÇ ¸¦ ÇØ¾ß¸¸ ÇÑ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
둁 ¸¸ÀÏ ´ç½ÅÀÇ Çڵ鷯°¡ ¾î´À Àü¿ªº¯¼ö¸¦ ¾ï¼¼½ºÇÒ Çʿ䰡 ÀÖ´Ù¸é, ±× º¯¼öµéÀ» Èֹ߼ºÀ¸·Î ¼±¾ðÇÏ ¶ó. À̰ÍÀº º¯¼öµéÀÇ °ªÀÌ ºñµ¿±âÀûÀ¸·Î º¯ÈÇÒ°ÍÀ̶ó°í ÄÄÆÄÀÏ·¯¿¡°Ô ¾Ë¸®°í, ±×¿Í°°Àº °»½Å¿¡ ÀÇ ÇØ ¹«È¿·Î ¸¸µé°Ô µÉ ¾î¶² ÃÖÀûȸ¦ ±ÝÇÑ´Ù.
둁 ¸¸ÀÏ Çڵ鷯¾ÈÀÇ ¾î¶² ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù¸é, ±×°ÍÀÌ ½Ã±×³¯µé¿¡ ´ëÇØ¼´Â ÀçÁøÀÔ¼ºÀÌ ÀÖÀ½À» È®½Ç È÷ Çϰųª, ½Ã±×³¯ÀÌ ÇÔ¼ö¿Í ¿¬°üµÈ È£Ãâ¿¡´Â ÀÎÅÍ·´Æ® ÇÒ ¼ö ¾øÀ½À» È®½ÇÈ÷Ç϶ó.
½ºÅØ(stack)»ó¿¡ Á¸ÀçÇÏÁö ¾Ê´Â ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â ÇÔ¼ö´Â ºñ-ÀçÁøÀÔ¼ºÀÌ µÉ ¼ö ¾ø´Ù.
둁 ¸¸ÀÏ ¾î¶² ÇÔ¼ö°¡ Á¤Àû º¯¼ö³ª Àü¿ªº¯¼ö, ¶Ç´Â µ¿ÀûÀ¸·Î ÇÒ´çµÈ ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇÑ´Ù¸é, ±×°ÍÀº ºñ-ÀçÁøÀÔ¼ºÀ̰í, ±× ÇÔ¼ö¸¦ µÎ ¹ø È£ÃâÇÏ¸é ¼·Î Ãæµ¹ÇÏ°Ô µÉ ¼ö ÀÖ´Ù.
¿¹¸¦µé¾î, ½Ã±×³¯ Çڵ鷯°¡ gethostbynameÀ» »ç¿ëÇÑ´Ù°í °¡Á¤ÇÏÀÚ. ÀÌ ÇÔ¼ö´Â Á¤Àû ¿ÀºêÁ§Æ®¿¡ ±× °ªÀ» ¸®ÅÏÇϰí, ¸Å¹ø °°Àº ¿ÀºêÁ§Æ®¸¦ ´Ù½Ã »ç¿ëÇÑ´Ù. ¸¸ÀÏ gethostbynameÀÌ È£ÃâµÈ µ¿¾È, ¶Ç´Â ½É Áö¾î ±× ÈÄ(ÇÏÁö¸¸ ¿©ÀüÈ÷ ±× °ªÀº ÇÁ·Î±×·¥¿¡¼ »ç¿ëÇϰí ÀÖ´Â ÁßÀÌ´Ù.)¶óµµ ±× ½Ã±×³¯ÀÌ µµÂøÇÏ´Â ÀÏÀÌ ¹ß»ýÇÑ´Ù¸é, ±×°ÍÀº ÇÁ·Î±×·¥ÀÌ ¿äûÇÑ ±× °ªÀ» Áö¿ö¹ö¸± °ÍÀÌ´Ù.
±×·¸Áö¸¸, ¸¸ÀÏ ±× ÇÁ·Î±×·¥ÀÌ gethostbyname À̳ª °°Àº ¿ÀºêÁ§Æ®¿¡ Á¤º¸¸¦ ¸®ÅÏÇÏ´Â ÇÔ¼ö¸¦ »ç¿ë ÇÏÁö ¾Ê°Å³ª, ¶Ç´Â ¸¸ÀÏ ±×¿Í °°Àº °ÍÀ» »ç¿ëÇÑ´Ù°í ÇØµµ ±×°ÍÀ» »ç¿ëÇÒ ¶§ ½Ã±×³¯µéÀ» ºí·ÏÇÑ´Ù¸é, ´ç½ÅÀº ¾ÈÀüÇÏ´Ù. ¶óÀ̺귯¸® ÇÔ¼öµéÀÇ ´ëºÎºÐÀº ÇÑ °íÁ¤ ¿ÀºêÁ§Æ®¿¡ °ªµéÀ» ¸®ÅÏÇϰí, Ç×»ó °°Àº ¿À ºêÁ§Æ®¸¦ Àç »ç¿ëÇϱ⠶§¹®¿¡ ±×µéÀº °°Àº ¹®Á¦¸¦ ¹ß»ý ½Ãų °¡´É¼ºÀÌ ÀÖ´Ù. ÀÌ ¸Å´º¾ó¾È¿¡ ÀÖ´Â ÇÔ¼öµé¿¡ ´ëÇÑ ¼³¸í¿¡´Â ÀÌ·¯ÇÑ °ÍµéÀ» Ç×»ó ¾ð±ÞÇÒ °ÍÀÌ´Ù.
둁 ¸¸ÀÏ ¾î¶² ÇÔ¼ö°¡ ´ç½ÅÀÌ °ø±ÞÇÑ ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇÏ°í °»½ÅÇÑ´Ù¸é, ±×°ÍÀº ÀáÀçÀûÀ¸·Î ºñ-ÁøÀÔ ¼ºÀÌ´Ù; °°Àº ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇϰí ÀÖ´Â µÎ °³ÀÇ È£ÃâÀº Ãæµ¹ÇÒ ¼ö ÀÖ´Ù.
ÀÌ¿Í °°Àº °æ¿ì´Â ´ç½ÅÀÌ ½ºÆ®¸²À» »ç¿ëÇØ¼ ÀÔ/Ãâ·ÂÀ» ÇÒ ¶§ ¹ß»ýÇÑ´Ù. ½Ã±×³¯ Çڵ鷯°¡ fprintf¸¦ »ç¿ëÇØ¼ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù°í °¡Á¤ÇÏÀÚ. ±×¸®°í ±× ÇÁ·Î±×·¥ÀÌ fpintf¸¦ ó¸®Çϰí ÀÖ´Â µµÁß¿¡ °° Àº ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇÏ´Â ½Ã±×³¯ÀÌ ¹è´ÞµÇ¾ú´Ù°í °¡Á¤ÇÏÀÚ. À̶§ µÎ °³ÀÇ È£ÃâÀº °°Àº µ¥ÀÌÅÍ ±¸Á¶ ü_½ºÆ®¸² ÀÚü_¿¡¼ µ¿ÀÛÇϱ⠶§¹®¿¡ Çڵ鷯ÀÇ ¸Þ½ÃÁö¿Í ÇÁ·Î±×·¥ÀÇ µ¥ÀÌÅÍ´Â ¸ðµÎ º¯Á¶µÉ °ÍÀÌ´Ù.
±×·¸Áö¸¸, ¸¸ÀÏ Çڵ鷯¿¡¼ »ç¿ëÇÏ´Â ½ºÆ®¸²ÀÌ ½Ã±×³¯ÀÌ µµÂøÇÏ¿© µ¿½Ã¿¡ ±× ½ºÆ®¸²ÀÌ ÇÁ·Î±×·¥¿¡ ÀÇÇØ »ç¿ëµÇ¾îÁú °¡´É¼ºÀÌ ¾ø´Ù´Â °ÍÀ» ´ç½ÅÀÌ ¾Ë°í ÀÖ´Ù¸é, ¾Æ¹«·± ¹®Á¦°¡ ¾ø´Ù. ±×¸®°í ¸¸ÀÏ ÇÁ·Î ±×·¥ÀÌ ´Ù¸¥ ½ºÆ®¸²À» »ç¿ëÇÑ´Ù¸é ¾Æ¹«·± ¹®Á¦°¡ ¾ø´Ù.
둁 ´ëºÎºÐÀÇ ½Ã½ºÅÛ¿¡¼, malloc °ú free´Â ¹«½¼ ¸Þ¸ð¸® ºí·ÏµéÀÌ ÇØÁ¦»óÅ¿¡ ÀÖ´ÂÁö¸¦ ±â·ÏÇϰí ÀÖ ´Â Á¤Àû µ¥ÀÌÅÍ ±¸Á¶Ã¼¸¦ »ç¿ëÇϱ⠶§¹®¿¡, ÀçÁøÀÔ¼ºÀÌ ¾ø´Ù. ±×·¸±â ¶§¹®¿¡ ¸Þ¸ð¸®¸¦ ÇÒ´çÇϰí ÇØ Á¦ÇÏ´Â ¶óÀ̺귯¸® ÇÔ¼öÁß¿¡ ÀçÁøÀÔ¼ºÀÌ ÀÖ´Â °ÍÀº ¾Æ¹«°Íµµ ¾ø´Ù. Çڵ鷯¿¡¼ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÒ ÇÊ ¿ä¸¦ ÇÇÇϱâ À§ÇÑ °¡Àå ÁÁÀº ¹æ¹ýÀº ½Ã±×³¯ Çڵ鷯¿¡¼ »ç¿ëÇÒ °ø°£À» ¹Ì¸® ÇÒ´ç¹Þ´Â °ÍÀÌ´Ù.
Çڵ鷯¿¡¼ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÏ´Â °ÍÀ» ÇÇÇÏ´Â °¡Àå ÁÁÀº ¹æ¹ýÀº ÇØÁ¦ÇÒ ¿ÀºêÁ§Æ®¸¦ Ç÷¡±×·Î Ç¥½ÃÇÏ °Å³ª ±â·ÏÇØµÎ°í, ¾î´À°ÍÀÌ ÇØÁ¦µÇ±â¸¦ ±â´Ù¸®°í ÀÖ´ÂÁö¸¦ ³ªÁß¿¡ ÇÁ·Î±×·¥¿¡¼ üũÇÏ´Â °ÍÀÌ´Ù. ±× ·¯³ª À̰ÍÀº ¿ÀºêÁ§Æ®µéÀÌ °³º°ÀûÀ¸·Î Á¸ÀçÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ¼·Î ¿¬°áµÇ¾î ÀÖ°í, °°Àº ÀÏÀ» ÇÏ´Â ´Ù¸¥ ½Ã±×³¯ Çڵ鷯¿¡ ÀÇÇØ¼ ±×°ÍÀÌ ÀÎÅÍ·´Æ®µÇ¾îÁ³´Ù¸é, ´ç½ÅÀº ¿ÀºêÁ§Æ®µéÁß Çϳª¸¦ "ÀÒ¾î"¹ö¸± ¼ö Àֱ⠶§¹®¿¡ ÁÖÀǸ¦ ÇØ¾ß¸¸ ÇÑ´Ù. GNU ½Ã½ºÅÛ¿¡¼, malloc °ú free´Â ½Ã±×³¯µéÀ» ºí·ÏÇϱ⠶§¹® ¿¡ ½Ã±×³¯ Çڵ鷯¿¡¼ »ç¿ëÇÏ´Â °ÍÀº ¾ÈÀüÇÏ´Ù. ±×·¸±â ¶§¹®¿¡, ½Ã±×³¯ Çڵ鷯¿¡¼ °á°ú¸¦ À§Çؼ °ø°£À» ÇÒ´çÇÏ´Â °ÍÀº ¶ÇÇÑ ¾ÈÀüÇÏ´Ù. obstack ÇÒ´ç ÇÔ¼öµéµµ ´ç½ÅÀÌ ½Ã±×³¯ Çڵ鷯ÀÇ ¿ÜºÎ¿Í ³»ºÎ ¾çÂÊ¿¡¼ °°Àº obstack¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é ¾ÈÀüÇÏ´Ù. Àç¹èÄ¡(relocating) ÇÒ´ç ÇÔ¼öµé( 3.6Àý [Relocating Allocator] 38ÆäÀÌÁö ÂüÁ¶.)À» ½Ã±×³¯ Çڵ鷯¾È¿¡¼ »ç¿ëÇÏ´Â °ÍÀº ¾ÈÀüÇÏÁö ¾ÊÀ½ÀÌ È®½Ç ÇÏ´Ù.
o errno¸¦ °»½ÅÇÏ´Â ¾î¶² ÇÔ¼öµéÀº ºñ-ÁøÀÔ¼ºÀÌÁö¸¸, ´ç½ÅÀº À̰ÍÀ» ÁøÀÔ¼ºÀ¸·Î ¸¸µé ¼ö ÀÖ´Ù: ÇÚ µé·¯¿¡¼, errnoÀÇ ¿ø·¡ °ªÀ» ÀúÀåÇϰí Á¤»óÀûÀ¸·Î ¸®ÅÏÇϱâ Àü¿¡ ±×°ÍÀ» ¹ÝȯÇÑ´Ù. À̰ÍÀº ½Ã±×³¯ Çڵ鷯 ³»ºÎ¿¡¼ ¹ß»ýµÈ ¿¡·¯µéÀÌ, Çڵ鷯°¡ ½ÇÇàµÇµµ·Ï ÇÁ·Î±×·¥ÀÌ ÀÎÅÍ·´Æ® µÈ ¼ø°£¿¡ ½Ã½ºÅÛ È£ Ãâ·ÎºÎÅÍ ¹ß»ýÇÑ ¿¡·¯¿Í È¥µ¿µÇ´Â °ÍÀ» ¸·´Â´Ù.
ÀÌ ±â¼úÀº ÀϹÝÀûÀ¸·Î ÀÀ¿ë°¡´ÉÇÏ´Ù; ¸¸ÀÏ ´ç½ÅÀÌ Çڵ鷯ÀÇ ³»ºÎ¿¡¼ ¸Þ¸ð¸®ÀÇ Æ¯Á¤ÇÑ ¿ÀºêÁ§Æ®¸¦ °»½ÅÇÏ´Â ÇÔ¼ö¸¦ È£ÃâÇϱ⠿øÇÑ´Ù¸é, ´ç½ÅÀº ±× ¿ÀºêÁ§Æ®¸¦ ÀúÀåÇÏ°í ´Ù½Ã ¹ÝȯÇÔÀ» ÅëÇØ¼ ¾ÈÀüÇÏ °Ô ±¸ÇöÇÒ ¼ö ÀÖ´Ù.
둁 ¸Þ¸ð¸® ¿ÀºêÁ§Æ®·ÎºÎÅÍ Àбâ´Â ½Ã±×³¯ÀÌ ¹è´ÞµÇ¾îÁú ¶§¶óµµ ¿ÀºêÁ§Æ®¿¡ ³ªÅ¸³¯ ¼ö ÀÖ´Â ¾î¶² °ªµéÀ» Ãë±ÞÇÒ¼ö ÀÖµµ·Ï ¾ÈÀüÇÏ°Ô Á¦°øµÇ¾ú´Ù. ¾î¶² µ¥ÀÌÅÍ Å¸ÀÔ¿¡ ¹èÁ¤(assignment)ÇÒ ¶§, ±× µ¥ÀÌ ÅÍ Å¸ÀÔÀÌ ¿øÀÚ´ÜÀ§°¡ ¾Æ´Ñ º¯¼ö¿¡ ¹èÁ¤(assignment)ÇÏ´Â "µµÁß¿¡" Çڵ鷯°¡ ½ÇÇàµÉ¼ö ÀÖ´Ù¸é ±× ¹è Á¤¿¡´Â ¸¹Àº ¸í·É(instruction)ÀÌ ¿ä±¸µÊÀ» ¸í½ÉÇ϶ó.
둁 ¸Þ¸ð¸® ¿ÀºêÁ§Æ®¿¡ ±â·ÏÇϱâ´Â Çڵ鷯°¡ ½ÇÇàµÇ°í ÀÖ´Â ¼ø°£ÀÏÁö¶óµµ ¾ÈÀüÇϰí, ¾î´À°Íµµ ¹æÇØ µÇÁö ¾ÊÀ» °ÍÀÌ´Ù.
21.4.7 ¿ø¼Ò µ¥ÀÌÅÍ ¾ï¼¼½º¿Í ½Ã±×³¯ Çڵ鸵
´ç½ÅÀÇ ¾îÇø®ÄÉÀ̼ǿ¡¼ µ¥ÀÌÅͰ¡ ¿øÀÚ¿Í °ü°è°¡ ÀÖ´øÁö, ¶Ç´Â ´Ü¼øÇÑ ÅØ½ºÆ®ÀÌ´øÁö, ´ç½ÅÀº ¿øÀÚ È°¡ ÇÊ¿ä¾ø´Â ´ÜÀÏÇÑ µ¥ÀÌÅ͸¦ ¾ï¼¼½ºÇÏ´Â ¿ä¼Ò¿¡ ´ëÇØ¼ ÁÖÀǸ¦ ÇØ¾ß¸¸ÇÑ´Ù. À̰ÍÀº ´ÜÀÏÇÑ ¿Àºê Á§Æ®¸¦ Àаųª ¾²±â À§Çؼ´Â ¿©·¯°³ÀÇ ¸í·ÉÀÌ ÇÊ¿äÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ±×¿Í °°Àº°æ¿ì¿¡, ½Ã±×³¯ Çڵ鷯´Â ¿ÀºêÁ§Æ®ÀÇ Àб⳪ ¾²±â Áß°£¿¡ ½ÇÇàµÉ ¼ö ÀÖ´Ù.
ÀÌ·¯ÇÑ ¹®Á¦¸¦ Ä¿¹öÇÒ ¼ö ÀÖ´Â ¼¼°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. ´ç½ÅÀº Ç×»ó ¿øÀÚ ´ÜÀ§·Î ¾ï¼¼½ºµÇ´Â µ¥ÀÌÅÍ Å¸ÀÔÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù; ¾ï¼¼½º¸¦ ÀÎÅÍ·´ÅÍÇÏ¿© ¾Æ¹«·± ºÎÀû´çÇÑ ÀÏÀÌ ÀϾÁö ¾Ê°Ô Çϰųª, ¶Ç´Â ÀÎÅÍ·´Æ® º¸´Ù´Â ÁÁÁö´Â ¾ÊÁö¸¸ ¾ï¼¼½ºµ¿¾È¿¡ ¸ðµç ½Ã±×³¯µéÀ» ºí·ÏÇÏ´Âµî ´ç½ÅÀº ÁÖÀDZíÀº Á¶Á¤À» ÇÒ ¼ö°¡ ÀÖ´Ù.
21.4.7.1 ºñ-¿øÀÚ ¾ï¼¼½º°¡ °®´Â ¹®Á¦Á¡
´ÙÀ½Àº º¯¼ö¸¦ °»½ÅÇÏ´Â µµÁß¿¡ ½Ã±×³¯ Çڵ鷯¸¦ ½ÇÇàÇÏ¸é ¹«½¼ÀÏÀÌ ¹ß»ýÇÏ´ÂÁö¸¦ º¸¿©ÁÖ´Â ¿¹Á¦ ÀÌ´Ù. (º¯¼ö Àб⸦ ÀÎÅÍ·´Æ® ÇÏ´Â °Íµµ ¿ª¼³ÀûÀÎ °á°ú¿¡ À̸£°Ô ÇÒ ¼ö ÀÖÁö¸¸, ¿©±â¼ ¿ì¸®´Â ¾²±â ¸¦ º¸¿©ÁØ´Ù.)
#include <signal.h>
#include <stdio.h>
struct two_words { int a, b; } memory;
void
handler(int signum)
{
printf ("%d,%d\n", memory.a, memory.b);
alarm (1);
}
int
main (void)
{
static struct two_words zeros = { 0, 0 }, ones = { 1, 1 };
signal (SIGALRM, handler);
memory = zeros;
alarm (1);
while (1)
{
memory = zeros;
memory = ones;
}
}
ÀÌ ÇÁ·Î±×·¥Àº °è¼Ó ¹ø°¥¾Æ°¡¸é¼ 0, 1, 0, 1 ·Î ¸Þ¸ð¸®¸¦ ä¿î´Ù; ±×µ¿¾È, ÀÏÃʸ¶´Ù, ¾Ë¶÷ ½Ã±×³¯ ÇÚ µé·¯´Â ÇöÀçÀÇ ³»¿ëÀ» ÇÁ¸°Æ®ÇÑ´Ù. ( Çڵ鷯 ¾È¿¡¼ printfÀÇ È£ÃâÀº ½Ã±×³¯ÀÌ ¹ß»ýÇßÀ» ¶§ Çڵ鷯¿Ü ºÎ¿¡¼ printf°¡ È®½ÇÈ÷ È£ÃâµÇ¾îÁöÁö ¾ÊÀ»°ÍÀ̹ǷΠÀÌ ÇÁ·Î±×·¥Àº ¾ÈÀüÇÏ´Ù. )
ºÐ¸íÈ÷, ÀÌ ÇÁ·Î±×·¥Àº 0 Çѽְú 1 ÇѽÖÀ» ÇÁ¸°Æ® ÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ±×°ÍÀÌ ±× ÇÁ·Î±×·¥ÀÌ ÇÒ ¼ö ÀÖ´Â ÀüºÎ°¡ ¾Æ´Ï´Ù! ´ëºÎºÐÀÇ ±â°è¿¡¼, ¸Þ¸ð¸®¿¡»õ·Î¿î °ªÀ» ÀúÀåÇϱâ À§Çؼ´Â ¿©·¯°³ÀÇ ¸í·ÉÀ» ÃëÇϰí, ±× °ªÀº µ¿½Ã¿¡ ÇÑ ¿öµå(word)¿¡ ÀúÀåµÈ´Ù. ¸¸ÀÏ ½Ã±×³¯ÀÌ ±× ¸í·Éµé »çÀÌ¿¡ ¹è´ÞµÈ´Ù¸é, Çڵ鷯´Â memory.a´Â 0À̰í memory.b´Â 1À롃 ¹ß°ßÇÒÁö ¸ð¸¥´Ù(¶Ç´Â ±×ÀÇ ¹Ý´ë).
ÇÑ °³ÀÇ ¸í·ÉÀ¸·Î ¸Þ¸ð¸®¾È¿¡ ÇÑ °³ÀÇ »õ·Î¿î °ªÀ» ÀúÀåÇÒ ¼ö ÀÖ´Â ¾î¶² ±â°è¿¡¼´Â ÀÎÅÍ·´Æ® µÉ ¼ö ¾ø´Ù. ±× ±â°èµé¿¡¼, Çڵ鷯´Â Ç×»ó µÎ °³ÀÇ 0°ú µÎ °³ÀÇ 1À» ÇÁ¸°Æ® ÇÒ °ÍÀÌ´Ù.
21.4.72 ¿øÀÚ Çü.
º¯¼ö¸¦ ¾ï¼¼½ºÇÒ ¶§ ÀÎÅÍ·´Æ® Çϴ°Ϳ¡ ´ëÇÑ ºÒÈ®½Ç¼ºÀ» ÇÇÇϱâ À§Çؼ, ´ç½ÅÀº Ç×»ó ¿øÀÚ´ÜÀ§·Î ¾ï¼¼½º¸¦ Çϴ Ưº°ÇÑ µ¥ÀÌÅÍ Å¸ÀÔÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù: sig_atomic_t. ÀÌ µ¥ÀÌÅÍŸÀÔÀ» Àбâ¿Í ¾²±â ´Â ´ÜÀÏÇÑ ¸í·ÉÀ¸·Î ¹ß»ýÇÑ´Ù´Â °ÍÀÌ º¸ÁõµÇ¹Ç·Î Çڵ鷯°¡ ¾ï¼¼½ºÀÇ "Áß°£¿¡" ½ÇÇàµÉ ¹æ¹ýÀÌ ¾ø´Â °ÍÀÌ´Ù.
sig_atomic_t ŸÀÔÀº Ç×»ó Á¤¼ö µ¥ÀÌÅÍ Å¸ÀÔÀÌÁö¸¸, ±× Å×ÀÌŸ ŸÀÔÀÌ ¸î °³ÀÇ ºñÆ®·Î ±¸¼ºµÇ¾îÀÖ ´ÂÁö´Â ÇѰ¡Áö·Î Á¤ÇØÁø °ÍÀÌ ¾Æ´Ï¶ó °¢°¢ÀÇ ±â°è¸¶´Ù ´Ù¾çÇÏ´Ù.
µ¥ÀÌÅÍ Å¸ÀÔ : sig__atomic__t
À̰ÍÀº Á¤¼ö µ¥ÀÌÅÍ Å¸ÀÔÀÌ´Ù. ÀÌ Å¸ÀÔÀÇ ¿ÀºêÁ§Æ®´Â Ç×»ó ÀÚµ¿ÀûÀ¸·Î ¾ï¼¼½ºµÈ´Ù.
½ÇÁ¦·Î, ´ç½ÅÀº int¿Í intº¸´Ù´Â ±æÁö ¾ÊÀº ´Ù¸¥ Á¤¼öÇüÀ» ¿ø¼Ò´ÜÀ§¶ó°í °¡Á¤ÇÒ ¼ö ÀÖ´Ù. ´ç½ÅÀº ¶Ç ÇÑ Æ÷ÀÎÅÍ ÇüÀ» ¿ø¼Ò´ÜÀ§·Î °¡Á¤ÇÒ ¼ö ÀÖ´Ù; ±×°ÍÀº ¸Å¿ì Æí¸®ÇÏ´Ù.GNU C ¶óÀ̺귯¸®¸¦ Áö¿øÇÏ´Â ¸ðµç ±â°è¿Í ¸ðµç POSIX ½Ã½ºÅÛ»ó¿¡¼ ±× µÎ °³ÀÇ °¡Á¤Àº ¸ðµÎ »ç½ÇÀÌ´Ù.
21.4.7.3 ¿ø¼Ò´ÜÀ§ »ç¿ë ÇüÅÂ.
¾ï¼¼½ºÀÇ ¾î¶² ÇüÅ´ ¾ï¼¼½º°¡ ÀÎÅÍ·´Æ® µÇ´Â°Í°ú °°Àº ¹®Á¦µéÀ» ÇÇÇÑ´Ù. ¿¹¸¦µé¾î, Çڵ鷯¿¡ ÀÇÇØ ¼³Á¤µÇ°í, ¶§¶§·Î ¸ÞÀÎ ÇÁ·Î±×·¥¿¡ ÀÇÇØ¼ ¼Ò°ÅµÇ°í Å×½ºÆ®µÇ´Â ¾î¶² Ç÷¡±×¸¦ ¾ï¼¼½ºÇϴµ¥ ½ÇÁ¦·Î µÎ °³ÀÇ ¸í·É(instructions)ÀÌ ÇÊ¿äÇÏ´Ù°í ÇÒÁö¶óµµ Ç×»ó ¾ÈÀüÇÏ´Ù. À̰ÍÀÌ ±×·¸°Ô º¸À̵µ·Ï Çϱâ À§ ÇØ¼, ¿ì¸®´Â ÀÎÅÍ·´Æ® µÇ¾îÁú ¼ö ÀÖ´Â ¸ðµç ¾ï¼¼½º¸¦ °í·ÁÇØ¾ß¸¸ Çϰí, ÀÎÅÍ·´Æ® µÇ¸é ¾Æ¹«·± ¹®Á¦ °¡ ¾øÀ½À» º¸¿©¾ß ÇÑ´Ù. Ç÷¡±×¸¦ Å×½ºÆ®ÇÏ´Â µµÁß¿¡ ¹ß»ýÇÑ ÀÎÅÍ·´Æ®´Â ¾Æ¹«·± ¹®Á¦°¡ ¾ø´Â Á¤È®ÇÑ °ªÀÎ °æ¿ì¿¡, 0ÀÌ ¾Æ´Ñ°ªÀ¸·Î ÀνÄÀÌ µÇ°Å³ª ¶Ç´Â Å×½ºÆ®µÈ ´ÙÀ½¿¡ 0ÀÌ ¾Æ´Ñ°ªÀ¸·Î µÇ¾îÁú°ÍÀ̱⠶§ ¹®¿¡ ¾Æ¹«·± ¹®Á¦°¡ ¾ø´Ù.
Ç÷¡±×¸¦ ¼Ò°ÅÇÏ´Â µµÁß¿¡ ÀÎÅÍ·´Æ®µµ ¾Æ¹«·± ¹®Á¦°¡ ¾ø´Âµ¥, Ç÷¡±×°¡ ¼Ò°ÅµÇ±âÀü¿¡ ½Ã±×³¯ÀÌ ¹ß »ýÇÑ °ÍÀº, ±× °ªÀÌ 0À¸·Î ³¡³ª°Å³ª, ¾Æ´Ï¸é 0ÀÌ ¾Æ´Ñ°ªÀ¸·Î ³¡³ª°í, Ç÷¡±×°¡ ¼Ò°ÅµÈÈÄ¿¡ ½Ã±×³¯ÀÌ ¹ß»ýÇѰÍó·³ ¿¬¼ÓÀûÀÎ »ç°ÇµéÀÌ ¹ß»ýÇÑ´Ù. ±× µÎ °³ÀÇ °æ¿ì ¸ðµÎ Äڵ尡 󸮵DZ⸸ Çϸé, Ç÷¡±× ¸¦ ¼Ò°ÅÇÏ´Â µµÁß¿¡ ¹ß»ýÇÑ ½Ã±×³¯ ¶ÇÇÑ Ã³¸® ÇÒ ¼ö ÀÖ´Ù. ( À̰ÍÀº ºñ-¿ø¼Ò´ÜÀ§ÀÇ »ç¿ëÀÌ ¾ðÁ¦ ¾È ÀüÇÒ ¼ö ÀÖ´ÂÁö¸¦ ´ç½Å¿¡°Ô ¼³¸íÇϱâ À§ÇÑ ¿¹Á¦ÀÌ´Ù. )
¶§¶§·Î ´ç½ÅÀº ´Ù¸¥ ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇØ¼ ¾î¶² ¿ÀºêÁ§Æ®ÀÇ »ç¿ëÀ» ¸·À½À¸·Î½á ±× ¿ÀºêÁ§Æ®¿¡ ÀÎÅÍ ·´Æ® µÇÁö¾Ê´Â ¾ï¼¼½º¸¦ º¸ÁõÇÒ ¼ö ÀÖ´Ù, ±×°ÍÀÇ ÇüÅ´ ¿ø¼Ò´ÜÀ§°¡ È®½ÇÇÒ °ÍÀÌ´Ù. 21.4.5Àý [Merged Signals] 288 ÆäÀÌÁö¿¡¼ ¿¹Á¦ÂüÁ¶.
21.5 ½Ã±×³¯¿¡ ÀÇÇØ ÀÎÅÍ·´Æ®µÈ ±âº»µ¿ÀÛ(Primitives)
open À̳ª read°¡ ÀÔ/Ãâ·Â µð¹ÙÀ̽º¿¡¼ ±â´Ù¸®´Â°Í°ú °°Àº ÀÔ/Ãâ·Â ±âº»µ¿ÀÛ µ¿¾È¿¡ ½Ã±×³¯ÀÌ ¹ß »ýÇÒ ¼öµµ ÀÖ°í ó¸®µÉ ¼öµµ ÀÖ´Ù. ¸¸ÀÏ ½Ã±×³¯ Çڵ鷯°¡ ¸®ÅÏÇϸé, ±× ½Ã½ºÅÛÀº Àǹ®À» °®´Â´Ù: ´ÙÀ½¿¡ ¹«½¼ÀÏÀÌ ¹ß»ýÇÏÁö?
POSIX´Â ÇѰ¡Áö Á¢±Ù¹ýÀ» Á¤ÇÑ´Ù: Áï½Ã ±× ±âº»µ¿ÀÛÀ» ½ÇÆÐ·Î ¸¸µç´Ù. ÀÌ·¯ÇÑ Á¾·ùÀÇ ½ÇÆÐ¸¦ À§ ÇÑ ¿¡·¯ÄÚµå´Â EINTRÀÌ´Ù. À̰ÍÀº À¯¿¬ÇÏÁö¸¸, º¸ÅëÀº ºÒÆíÇÏ´Ù. ÀüÇüÀûÀ¸·Î, POSIX ¾îÇø®ÄÉÀÌ ¼ÇÀº ±× È£ÃâÀ» ´Ù½Ã ÇÒ ¸ñÀûÀ¸·Î ¶óÀ̺귯¸® ÇÔ¼ö°¡ ¸®ÅÏÇßÀ» ¶§ EINTRÀÎÁö üũÇÏ´Â ½Ã±×³¯ ÇÚ µé·¯¸¦ »ç¿ëÇÑ´Ù. Á¾Á¾ ÇÁ·Î±×·¡¸ÓµéÀº üũÇÏ´Â °ÍÀ» Àش´Ù.
GNU ¶óÀ̺귯¸®´Â ¸ÅÅ©·Î TEMP_FAILURE_RETRY¸¦ »ç¿ëÇØ¼, ÀÓ½ÃÀûÀÎ ½ÇÆÐÈÄ¿¡ ´Ù½Ã È£ÃâÀ» ½ÃµµÇϵµ·ÏÇÏ´Â Æí¸®ÇÑ ¹æ¹ýÀ» Á¦°øÇÑ´Ù.
¸ÅÅ©·Î : TEMP__FAILURE__RETRY (expression)
ÀÌ ¸ÅÅ©·Î´Â ÀÏ´Ü expressionÀ» Æò°¡ÇÑ´Ù. ¸¸ÀÏ ±×°ÍÀÌ ½ÇÆÐÀÌ¸é ¿¡·¯ÄÚµå EINTRÀ» º¸°íÇϰí, TEMP_FAILURE_RETRY´Â ±×°ÍÀ» ´Ù½Ã Æò°¡Çϰí, ±×°ÍÀÌ ÀϽÃÀûÀÎ ½ÇÆÐ°¡ ¾Æ´Ò¶§±îÁö °è¼Ó ¹Ýº¹ ÇÑ´Ù. TEMP_FAILURE_RETRY¿¡ ÀÇÇØ ¸®ÅϵȰªÀº ¼öÇàµÈ expressionÀÇ °ªÀÌ´Ù.
BSD´Â ¿ÏÀüÈ÷ EINTRÀ» ÇÇÇϰí Á»´õ Æí¸®ÇÑ Á¢±Ù¹ýÀ» Á¦°øÇÑ´Ù: ±×°ÍÀ» ½ÇÆÐ·Î ¸¸µå´Â ´ë½Å¿¡ ÀÎÅÍ·´Æ®µÈ ±âº»µ¿ÀÛÀ» ´Ù½Ã ½ÃÀÛÇÑ´Ù. ¸¸ÀÏ ´ç½ÅÀÌ ÀÌ Á¢±Ù¹ýÀ» ¼±ÅÃÇÑ´Ù¸é, ´ç½ÅÀº EINTR¿¡ °ü ½ÉÀ» °¡Áú Çʿ䰡 ¾ø´Ù.
GNU ¶óÀ̺귯¸®¿¡¼´Â Á¢±Ù¹ýÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ¸¸ÀÏ ´ç½ÅÀÌ ½Ã±×³¯ Çڵ鷯¸¦ ¸¸µå´Â sigactionÀ» »ç¿ëÇÑ´Ù¸é, ´ç½ÅÀº Çڵ鷯°¡ ¾î¶»°Ô µ¿ÀÛÇÒÁö¸¦ Á¤ÇÒ ¼ö ÀÖ´Ù. ¸¸ÀÏ ´ç½ÅÀÌ SA_RESTART Ç÷¡±×¸¦ ÁöÁ¤Çϸé, Çڵ鷯ºÎÅÍÀÇ ¸®ÅÏÀº ¾î¶² ±âº»µ¿ÀÛÀ» ´Ù½Ã ½ÃÀÛÇÒ °ÍÀÌ´Ù; ±× ·¸Áö¾ÊÀ¸¸é, Çڵ鷯·ÎºÎÅÍÀÇ ¸®ÅÏÀº EINTRÀ» ¹ß»ýÇÒ °ÍÀÌ´Ù. 21.3.5Àý [Flags for Sigaction] 284 Æä ÀÌÁö ÂüÁ¶.
´Ù¸¥¹æ¹ýÀº siginterrupt ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. 21.9.1Àý [POSIX vs BSD] 306 ÆäÀÌÁö ÂüÁ¶.
´ç½ÅÀÌ ÇÑ Æ¯Á¤ÇÑ Çڵ鷯¿¡¼ sigaction À̳ª siginterrupt·Î ÇÒ ÀÏÀ» Á¤ÇÏÁö ¾ÊÀ» ¶§, ±×°ÍÀº µðÆú Æ® ¼±ÅÃÀ» »ç¿ëÇÑ´Ù. GNU ¶óÀ̺귯¸®¿¡¼ µðÆúÆ® ¼±ÅÃÀº ´ç½ÅÀÌ Á¤ÀÇÇÑ Å×½ºÆ® ¸ÅÅ©·Î¿¡ ÀÇÁ¸ÇÑ ´Ù. ¸¸ÀÏ ½Ã±×³¯ÀÌ ¹ß»ýµÇ±âÀü¿¡ _BSD_SOURCE ¶Ç´Â _GNU_SOURCE·Î Á¤ÀÇÇϸé, µðÆúÆ®´Â ±âº» µ¿ÀÛÀ» ´Ù½Ã ½ÃÀÛÇÏ´Â °ÍÀÌ´Ù; ±×·¸Áö ¾Ê´Ù¸é, µðÆúÆ®´Â EINTR·Î ±×µéÀ» ½ÇÆÐÇÏ°Ô ¸¸µå´Â °ÍÀÌ´Ù. ( ¶óÀ̺귯¸®´Â signal ÇÔ¼öÀÇ ´Ù¾çÇÑ º¯ÇüÀ» Æ÷ÇÔÇϰí ÀÖ°í, ´ç½ÅÀÌ »ç¿ëÇÑ Å×½ºÆ® ¸ÅÅ©·Î¿¡ µû¶ó¼ ½ÇÁ¦·Î È£ÃâµÉ signal ÇÔ¼ö°¡ °áÁ¤µÈ´Ù. ) 1.3.4Àý [Feature Test Macros] 6 ÆäÀÌÁö ÂüÁ¶. À§¿Í °°Àº ¹®Á¦¿¡ ¿µÇâÀ» ¹Þ´Â ±âº»µ¿ÀÛµéÀº close, fcntl(operation F_SETLK), open, read, recv, recvfrom, select, send, sendto, tcdrain, waitpid, wait, ±×¸®°í write°¡ ÀÖ´Ù.
°áÄÚ Àç°³(resumption)°¡ ¹ß»ýµÇÁö ¾Ê´Â ÇѰ¡Áö »óȲÀÌ ÀÖ´Ù: read ¿Í write ¿Í °°Àº µ¥ÀÌÅÍ-ÂüÁ¶ ÇÔ¼ö°¡ µ¥ÀÌÅÍÀÇ ÀϺκи¸À» ÂüÁ¶ÇÑ ÈÄ¿¡ ½Ã±×³¯¿¡ ÀÇÇØ¼ ÀÎÅÍ·´Æ® µÇ¾úÀ» ¶§. ÀÌ °æ¿ì, ±× ÇÔ¼ö´Â ºÎºÐÀûÀÎ ¼º°øÀ» ÁöÀûÇϱâ À§Çؼ, ÀÌ¹Ì ÂüÁ¶µÈ ¹ÙÀÌÆ®ÀÇ °³¼ö¸¦ ¸®ÅÏÇÑ´Ù.
·¹ÄÚµå-ÁöÇâ µð¹ÙÀ̽º»ó¿¡¼´Â µÎ °³ÀÇ ·¹Äڵ带 read Çϰųª writeÇÏ·Á´Â °Í¿¡¼ ÇÑ °³·Î read, write¸¦ ºÐ¸®Çعö¸®´Â °Í °ú °°Àº ÀÌ»óÇÑ µ¿ÀÛÀÇ ¿øÀÎÀÌ µÉ ¼öµµ ÀÖ´Ù.(µ¥ÀÌŸ±×·¥ ¼ÒÄÏÀ» Æ÷ÇÔ; 11.9Àý [Datagrams] 176 ÆäÀÌÁö ÂüÁ¶.). ½ÇÁ¦·Î´Â, ±×¿Í °°Àº µð¹ÙÀ̽º »ó¿¡¼´Â µ¥ÀÌÅ͸¦ ÂüÁ¶ Áß ¿¡ ÀÎÅÍ·´¼ÇÀÌ ¹ß»ýÇÒ ¼ö ¾ø±â ¶§¹®¿¡ ¾Æ¹«·± ¹®Á¦°¡ ¾ø´Ù; ±×¿Í °°Àº µð¹ÙÀ̽ºµéÀº ÀÏ´Ü µ¥ÀÌÅÍ ÂüÁ¶°¡ ½ÃÀÛµÇ¸é ¾Æ¹«·± ±â´Ù¸²ÀÌ ¾øÀÌ, ÇÑ ¹ö½ºÆ®(burst)¿¡ Àüü ·¹Äڵ带 Ç×»ó ÂüÁ¶ÇÑ´Ù.
**¿ªÀÚÁÖ : ¹ö½ºÆ®(burst) : Áß°£¿¡ ¾î¶² ÀÌÀ¯µé·Î ÀÎÇØ¼ Áß´ÜÀÌ ¹ß»ýÇÏÁö ¾Ê°í, ÇÑ ¹À½ÀÇ µ¥ÀÌ Å͸¦ ÇѲ¨¹ø¿¡ Àü´ÞÇÏ´Â ¹æ¹ýÀ» ÀǹÌÇÔ.
21.6 ½Ã±×³¯ ¹ß»ý½Ã۱â.
Çϵå¿þ¾î Æ®·¦À̳ª ÀÎÅÍ·´Æ®ÀÇ °á°ú·Î¼ ¹ß»ýµÇ´Â ½Ã±×³¯À» Á¦¿ÜÇϰí, ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡¼ ÇÁ·Î¼¼ ½º, ¶Ç´Â ´Ù¸¥ ÇÁ·Î¼¼½º¿¡°Ô ¸í½ÃÀûÀ¸·Î ½Ã±×³¯À» º¸³¾ ¼ö ÀÖ´Ù.
21.6.1 ½º½º·Î¿¡°Ô½ÅÈ£º¸³»±â.
ÇÁ·Î¼¼½º´Â raise ÇÔ¼ö¸¦ ÅëÇØ¼ ½Ã±×³¯À» ½º½º·Î¿¡°Ô º¸³¾ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â `signal.h'¿¡ ¼±¾ðµÇ ¾î ÀÖ´Ù.
ÇÔ¼ö : int raise (int signum)
raise ÇÔ¼ö´Â È£ÃâÇÑ ÇÁ·Î¼¼½º¿¡°Ô ½Ã±×³¯ signumÀ» º¸³½´Ù. ¼º°øÇϸé 0À» ¸®ÅÏÇÏ°í ½ÇÆÐÇϸé 0ÀÌ ¾Æ´Ñ°ªÀ» ¸®ÅÏÇÑ´Ù. ½ÇÆÐÇÏ°Ô µÇ´Â À¯ÀÏÇÑ ÀÌÀ¯´Â signumÀÇ °ªÀÌ ¹«È¿ÇÑ °æ¿ìÀÌ´Ù.
ÇÔ¼ö : int gsignal (int signum)
gsignal ÇÔ¼ö´Â raise¿Í °°ÀºÀÏÀ» ÇÏÁö¸¸ SVID¿ÍÀÇ È£È¯¼ºÀ» À§Çؼ Á¦°øµÈ´Ù.
raise »ç¿ëÀ¸·Î ÇѰ¡Áö Æí¸®ÇÑ Á¡Àº ´ç½ÅÀÌ Æ®·¦Çß´ø ½Ã±×³¯ÀÇ µðÆúÆ® µ¿ÀÛÀ» Àç»ýÇÒ ¼ö ÀÖ´Ù´Â°Í ÀÌ´Ù. À̸¦Å׸é, ´ç½ÅÀÇ ÇÁ·Î±×·¥À» »ç¿ëÇÏ´Â »ç¿ëÀÚ°¡ stop ½Ã±×³¯(SIGTSTP)À» º¸³»±â À§Çؼ SUSP ¹®ÀÚ¸¦ ŸÀÌÇÎÇÒ ¶§, ´ç½ÅÀº ¸ØÃß±â Àü¿¡ ¾î¶² ³»ºÎÀû µ¥ÀÌÅÍ ¹öÆÛµéÀ» ¼Ò°ÅÇϱ⸦¿øÇÑ´Ù°í °¡Á¤ÇÏÀÚ. ´ç½ÅÀº ´ÙÀ½Ã³·³ À̰ÍÀ» ¼³Á¤ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
#include <signal.h>
/* stop ½Ã±×³¯ÀÌ µµÂøÇßÀ» ¶§, ¿ø·¡ÀÇ µðÆúÆ®·Î µ¿ÀÛÀ» ¼³Á¤ÇÏ°í ¼Ò°Å µ¿ÀÛÀ» ÇÑÈÄ¿¡ ±× ½Ã±×³¯À» ´Ù½Ã º¸³½´Ù. */
void
tstp_handler (int sig)
{
signal (SIGTSTP, SIG_DFL);
/* ¿©±â¼ ¼Ò°Å µ¿ÀÛÀ» Ç϶ó */
. . .
raise (SIGTSTP);
}
/* ÇÁ·Î¼¼½º°¡ ´Ù½Ã °è¼ÓµÉ ¶§, ½Ã±×³¯ Çڵ鷯¸¦ ¹ÝȯÇ϶ó. */
void
cont_handler (int sig)
{
signal (SIGCONT, cont_handler);
signal (SIGTSTP, tstp_handler);
}
/* ÇÁ·Î±×·¥À» ÃʱâÈÇÏ´Â µ¿¾È¿¡ ¾ç(both) Çڵ鷯¸¦ °¡´ÉÇÏ°Ô Ç϶ó */
int
main (void)
{
signal (SIGCONT, cont_handler);
signal (SIGTSTP, tstp_handler);
. . .
}
À̽ļº ³ëÆ®: raise ´Â ANSI C À§¿øÈ¸¿¡ ÀÇÇØ ¸¸µé¾îÁ³´Ù. ¿À·¡µÈ ½Ã½ºÅÛµéÀº ±×°ÍÀ» Áö¿øÇÏÁö ¾ÊÀ»°ÍÀ̱⠶§¹®¿¡, À̽ļºÀ» À§Çؼ´Â killÀ» »ç¿ëÇ϶ó. 21.6.2Àý[Signaling Another Process] 295 ÆäÀÌÁö ÂüÁ¶.
21.6.2 ´Ù¸¥ ÇÁ·Î¼¼½º¿¡°Ô ½Ã±×³¯º¸³»±â.
kill ÇÔ¼ö´Â ´Ù¸¥ ÇÁ·Î¼¼½º¿¡°Ô ½Ã±×³¯À» º¸³»±â À§Çؼ »ç¿ëµÉ ¼ö ÀÖ´Ù. ÇÔ¼öÀÇ ¸íĪÀÌ ¾ÇÀÇÀûÀÌÁö ¸¸, ±×°ÍÀº ´Ù¸¥ ÇÁ·Î¼¼½º¸¦ Á¾·á½Ã۴µ¥ »ç¿ëÇϱ⠺¸´Ù´Â ´õ ¸¹Àº°ÍµéÀ» À§Çؼ »ç¿ëµÉ ¼ö ÀÖ´Ù. ´ÙÀ½ÀÇ °æ¿ì, ´ç½ÅÀÌ ÇÁ·Î¼¼½ºµé »çÀÌ¿¡ ½Ã±×³¯µéÀ» º¸³»±â ¿øÇÒ ¶§ »ç¿ëÇÒ¼ö ÀÖ´Ù.
둁 ºÎ¸ð ÇÁ·Î¼¼½º°¡ ÀÛ¾÷À» ¼öÇàÇϱâ À§Çؼ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ½ÃÀÛÇÑ´Ù. _¾Æ¸¶µµ ÀÚ½Ä ÇÁ·Î¼¼½º´Â ÇÑÁ¤µÈ ·çÇÁ¸¦ µ¹°ÍÀ̰í_ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ÀÛ¾÷¿¡¼ ´õ ÀÌ»ó ÇÊ¿äÄ¡ ¾ÊÀ» ¶§ Á¾·áÇÑ´Ù.
둁 ÇÑ ÇÁ·Î¼¼½º°¡ ±×·ì(group)ÀÇ ÀÏºÎ·Î½á ½ÇÇàµÉ ¶§, ¿¡·¯³ª ´Ù¸¥ »ç°ÇÀÌ ¹ß»ýÇÏ¸é ±×·ì¿¡ ÀÖ´Â ´Ù ¸¥ ÇÁ·Î¼¼½º¿¡°Ô ½Å°íÇϰųª Á¾·áÇÒ Çʿ䰡 ÀÖ´Ù.
둁 µÎ °³ÀÇ ÇÁ·Î¼¼½º°¡ ¼·Î ÀÛ¾÷ÇÏ´Â µ¿¾È µ¿±â(synchronize)ÇÒ Çʿ䰡 ÀÖ´Ù.
ÀÌ ÀýÀº ´ç½ÅÀÌ ÇÁ·Î¼¼½º°¡ ¾î¶»°Ô ÀÛ¾÷ÇÏ´ÂÁö¿¡ ´ëÇØ¼ Á¶±ÝÀ̳ª¸¶ ¾Ë°ÍÀ̶ó°í °¡Á¤ÇÑ´Ù. ÀÌ ÁÖ Á¦¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â 23Àå [Child Process] 325 ÆäÀÌÁö¿¡ ³ª¿ÍÀÖ´Ù.
kill ÇÔ¼ö´Â `signal.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
ÇÔ¼ö : int kill (pid_t pid, int signum)
kill ÇÔ¼ö´Â pid·Î Á¤ÇØÁø ÇÁ·Î¼¼½º³ª ÇÁ·Î¼¼½º ±×·ì¿¡°Ô ½Ã±×³¯ signumÀ» º¸³½´Ù. 21.2Àý [Standard Signals] ¿¡ ³ª¿ÍÀÖ´Â ½Ã±×³¯µé»Ó¸¸ ¾Æ´Ï¶ó, signumÀº pidÀÇ À¯È¿¼ºÀ» üũÇϱâ À§Çؼ 0 ÀÇ °ªÀ» °¡Áú ¼ö ÀÖ´Ù. pid´Â ½Ã±×³¯À» ¹Þ±âÀ§ÇÑ ÇÁ·Î¼¼½º³ª ÇÁ·Î¼¼½º ±×·ìÀ» ÁöÁ¤ÇÑ´Ù.
pid > 0
pid´Â ÇÁ·Î¼¼½ºÀÌ´Ù.
pid == 0
°°Àº ÇÁ·Î¼¼½º ±×·ì¿¡ ÀÖ´Â ¸ðµç ÇÁ·Î¼¼½º¿¡°Ô ½Ã±×³¯À» º¸³»Áö¸¸, ½Ã±×³¯À» º¸³»´Â ÇÁ·Î¼¼½º ÀÚü ´Â ±× ½Ã±×³¯À» ¹ÞÁö ¾Ê´Â´Ù.
pid < -1
-pid´Â ÇÁ·Î¼¼½º ±×·ìÀÌ´Ù.
pid == -1
¸¸ÀÏ ±× ÇÁ·Î¼¼½º¿¡°Ô Ư±ÇÀÌ ºÎ¿©µÇ¾î ÀÖ´Ù¸é, ¾î¶² Ưº°ÇÑ ½Ã½ºÅÛ ÇÁ·Î¼¼½ºµéÀ» Á¦¿ÜÇÑ ¸ðµç ÇÁ·Î ¼¼½ºµé¿¡°Ô ½Ã±×³¯À» º¸³½´Ù. ±×·¸Áö¾Ê´Ù¸é, °°Àº »ç¿ëÀÚ ID¸¦ °¡Áø ¸ðµç ÇÁ·Î¼¼½º¿¡°Ô ½Ã±×³¯
À» º¸³½´Ù.
kill (getpid(), signum) °ú °°Àº È£Ãâ·Î ÇÁ·Î¼¼½º´Â Àڽſ¡°Ô ½Ã±×³¯ signumÀ» º¸³¾ ¼ö ÀÖ´Ù. ¸¸ÀÏ killÀÌ Àڽſ¡°Ô ½Ã±×³¯À» º¸³»µµ·Ï ¾î¶² ÇÁ·Î¼¼½º¿¡ ÀÇÇØ »ç¿ëµÇ°í, ±× ½Ã±×³¯ÀÌ ºí·ÏµÇÁö ¾Ê´Â´Ù¸é, killÀº ¸®ÅÏÇϱâ Àü¿¡ ÇÁ·Î¼¼½º¿¡°Ô Àû¾îµµ ÇÑ °³ÀÇ ½Ã±×³¯( ½Ã±×³¯ signum ´ë½Å¿¡ ¾ÆÁ÷ ¹ÌÇØ°á »ó Å·Π³²¾ÆÀÖ´Â ºí·ÏµÇÁö ¾ÊÀº ´Ù¸¥ ½Ã±×³¯ÀÌ µÉ ¼öµµ ÀÖ´Ù.)À» ¹è´ÞÇÑ´Ù. kill·Î ºÎÅÍÀÇ ¸®ÅϰªÀº, ¸¸ ÀÏ ¼º°øÀûÀ¸·Î ½Ã±×³¯ÀÌ º¸³»Áú ¼ö ÀÖ´Ù¸é 0À» ¸®ÅÏÇÑ´Ù. ±×·¸Áö ¾Ê°í, ¾Æ¹«·± ½Ã±×³¯µµ º¸³¾ ¼ö ¾ø ´Ù¸é -1À» ¸®ÅÏÇÑ´Ù. ¸¸ÀÏ pid¸¦ ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º¿¡°Ô ½Ã±×³¯À» º¸³»µµ·Ï ÁöÁ¤ÇÑ´Ù¸é, ±×¶§ ¸¸ÀÏ killÀÌ ±×µé¿¡°Ô Àû¾îµµ ÇÑ °³ÀÇ ½Ã±×³¯À» º¸³¾ ¼ö ÀÖ´Ù¸é ¼º°øÇÑ °ÍÀÌ´Ù. ´ç½ÅÀÌ ±×µé ¸ðµÎ¿¡°Ô ½Ã ±×³¯ÀÌ °¬´ÂÁö ¶Ç´Â ¾î¶² ÇÁ·Î¼¼½º°¡ ½Ã±×³¯À» ¾ò¾ú´ÂÁö¸¦ ¾Ë ¼ö ÀÖ´Â ¹æ¹ýÀº ¾ø´Ù.
´ÙÀ½ÀÇ errno´Â ÀÌ ÇÔ¼ö¸¦ À§ÇØ Á¤ÀÇµÈ ¿¡·¯»óȲÀÌ´Ù.
EINVAL
signum Àμö°¡ ¹«È¿Çϰųª ±× ¼ýÀÚ¸¦ Áö¿øÇÏÁö ¾Ê´Â ½Ã±×³¯ ¹øÈ£¸¦ »ç¿ëÇß´Ù.
EPERM
´ç½ÅÀº pid¿¡ ÀÇÇØ ÁöÁ¤µÈ ÇÁ·Î¼¼½º³ª ÇÁ·Î¼¼½º ±×·ì¾ÈÀÇ ¾î¶² ÇÁ·Î¼¼½ºµé¿¡°Ô ½Ã±×³¯À» º¸³»±â À§ ÇÑ Æ¯±ÇÀ» °®°í ÀÖÁö ¾Ê´Ù.
ESCRH
pid Àμö°¡ ÇöÁ¸Çϰí ÀÖ´Â ÇÁ·Î¼¼½º³ª ±×·ìÀ¸·Î ÁöÁ¤µÇÁö ¾Ê¾Ò´Ù.
ÇÔ¼ö : int killpg (int pgid, int signum)
À̰ÍÀº kill°ú À¯»çÇÏÁö¸¸, ÇÁ·Î¼¼½º ±×·ì¿¡°Ô´Â ½Ã±×³¯À» º¸³¾¼ö ¾ø´Ù. ÀÌ ÇÔ¼ö´Â BSD¿ÍÀÇ È£È¯¼º À» À§Çؼ Á¦°øµÇ¾ú´Ù; À̽ļºÀ» À§Çؼ´Â killÀ» »ç¿ëÇ϶ó.
kill »ç¿ëÀÇ °£´ÜÇÑ ¿¹·Î¼, kill(getpid(), sig)´Â raise(sig)¿Í °°Àº È¿°ú¸¦ °®´Â´Ù.
21.6.3 killÀ» »ç¿ëÇϱâ À§ÇÑ Çã°¡.
¾î´À ÀÓÀÇÀÇ ÇÁ·Î¼¼½º¿¡°Ô ½Ã±×³¯À» º¸³»±â À§Çؼ killÀ» »ç¿ëÇÏ´Â °ÍÀ» ¹æÁöÇϱâ À§ÇÑ Á¦ÇÑÀÌ ÀÖ ´Ù. ±×°ÍÀº ´Ù¸¥ »ç¿ëÀÚ¿¡°Ô ¼Ò¼ÓµÇ¾î ÀÖ´Â ÇÁ·Î¼¼½º¸¦ Á¦¸Ú´ë·Î Á×À̴°Ͱú °°Àº ¹Ý»çȸÀûÀÎ Çൿ À» ¹æÁöÇϱâ À§ÇÑ Àǵµ°¡ ÀÖ´Ù. killÀ» Àڽİú ºÎ¸ð ÇÁ·Î¼¼½º»çÀÌ¿¡ ½Ã±×³¯À» ÁÖ°í ¹Þ±âÀ§ÇØ »ç¿ëÇÏ ´Â°Í°ú °°Àº »óȲ¿¡¼´Â, º¸Åë ´ç½ÅÀº ½Ã±×³¯À» º¸³»±â À§ÇÑ Çã°¡±ÇÀ» °®°í ÀÖ´Ù. ±×·¯³ª ÀÚ½Ä ÇÁ·Î ¼¼½º¿¡¼ setuid ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ¶§´Â À¯ÀÏÇÏ°Ô Á¦¿ÜµÈ´Ù; ¸¸ÀÏ ÇÁ·Î±×·¥ÀÌ ½ÇÁ¦ UID¸¦ À¯È¿ UID·Î º¯°æÇÑ´Ù¸é, ´ç½ÅÀº ½Ã±×³¯À» º¸³»±â À§ÇÑ Çã°¡±ÇÀ» °¡ÁöÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù. su ÇÁ·Î±×·¥À» ÀÌ·±ÀÏÀ» ÇÑ´Ù.
ÇÁ·Î¼¼½º°¡ ´Ù¸¥ ÇÁ·Î¼¼½º¿¡°Ô ½Ã±×³¯À» º¸³»±â À§ÇÑ Çã°¡±ÇÀ» °¡Áö°í ÀÖ´ÂÁö ¾ø´ÂÁöÀÇ ¿©ºÎ´Â µÎ °³ÀÇ ÇÁ·Î¼¼½ºÀÇ »ç¿ëÀÚ IDµé¿¡ ÀÇÇØ °áÁ¤µÈ´Ù. ÀÌ ¿øÄ¢Àº 25.2Àý [Process Personal] 353 ÆäÀÌÁö¿¡ ÀÚ¼¼ÇÏ°Ô ³íÀǵǰí ÀÖ´Ù.
ÀϹÝÀûÀ¸·Î, ¾î¶² ÇÁ·Î¼¼½º°¡ ´Ù¸¥ ÇÁ·Î¼¼½º¿¡°Ô ½Ã±×³¯À» º¸³¾¼ö ÀÖ±â À§Çؼ´Â, ½Ã±×³¯À» º¸³»´Â ÇÁ·Î¼¼½º°¡ Ư±ÇÀÌ ºÎ¿©µÈ »ç¿ëÀÚ(`root'ó·³)À̰ųª ½Ã±×³¯À» º¸³»´Â ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ ¶Ç´Â À¯È¿ »ç ¿ëÀÚ ID°¡ ½Ã±×³¯À» ¹Þ´Â ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ ¶Ç´Â À¯È¿ »ç¿ëÀÚ ID¿Í ¸ÅÄ¡µÇ¾î¾ß¸¸ ÇÑ´Ù. ¸¸ÀÏ ½Ã±×³¯ À» ¹Þ´Â ÇÁ·Î¼¼½º°¡ ÇÁ·Î¼¼½º À̹ÌÁö ÆÄÀÏ¿¡¼ set-user-ID ¸ðµå¸¦ ÅëÇØ À¯È¿ »ç¿ëÀÚ ID¸¦ º¯°æÇß ´Ù¸é, ÇÁ·Î¼¼½º À̹ÌÁö ÆÄÀÏÀÇ ¼ÒÀ¯ÀÚ°¡ ÇöÀç À¯È¿ »ç¿ëÀÚ ID ´ë½Å¿¡ »ç¿ëµÈ´Ù. ¾î¶² °æ¿ì¿¡, ¸¸ÀÏ »ç¿ëÀÚ IDµéÀÌ ¸ÅÄ¡µÇÁö ¾Ê´Â´Ù ÇÒÁö¶óµµ ºÎ¸ð ÇÁ·Î¼¼½º°¡ ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô ½Ã±×³¯À» º¸³»´Â °Í ÀÌ °¡´ÉÇϰí, ´Ù¸¥ °æ¿ì¿¡´Â ´Ù¸¥ Á¦ÇѵéÀÌ °¿ä µÉ °ÍÀÌ´Ù. SIGCONT ½Ã±×³¯Àº Ưº°ÇÑ °æ¿ìÀÌ´Ù. ±×°ÍÀº ¸¸ÀÏ ½Ã±×³¯À» º¸³»´ÂÂÊÀÌ ½Ã±×³¯À» ¹Þ´ÂÂʰú °°Àº ¼¼¼Ç¿¡ ÀÖ´Ù¸é, »ç¿ëÀÚ IDµé¿¡ »ó°ü¾øÀÌ ½Ã±×³¯À» º¸³¾ ¼ö ÀÖ´Ù.
21.6.4 Åë½ÅÀ» À§Çؼ killÀ» »ç¿ëÇϱâ.
´ÙÀ½Àº ÇÁ·Î¼¼½º°£ Åë½ÅÀ» À§Çؼ ¾î¶»°Ô ½Ã±×³¯µéÀ» »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö º¸¿©ÁÖ´Â Á¶±Ý ±ä ¿¹Á¦ ÇÁ ·Î±×·¥ÀÌ´Ù. SIGUSR1 °ú SIGUSR2°¡ ÇÁ·Î¼¼½º °£ Åë½ÅÀ» Áö¿øÇÏÁö À§ÇÏ¿© Á¦°øµÈ °ÍÀÌ´Ù. ±× ½Ã ±×³¯µéÀº ±âº»ÀûÀ¸·Î Ä¡¸íÀûÀ̱⠶§¹®¿¡, ±× ½Ã±×³¯µéÀ» ¹ÞÀ»°ÍÀ¸·Î °¡Á¤µÇ´Â ÇÁ·Î¼¼½º´Â signal ÀÌ ³ª sigactionÀ» ÅëÇØ¼ ±×µéÀ» Æ®·¦Çؾ߸¸ ÇÑ´Ù.
´ÙÀ½ÀÇ ¿¹Á¦´Â, ºÎ¸ð ÇÁ·Î¼¼½º°¡ fork·Î ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÑ ´ÙÀ½ ÀÚ½Ä ÇÁ·Î¼¼½º°¡ Ãʱâȸ¦ ¼öÇàÇÒ¶§±îÁö ±â´Ù¸°´Ù. ÀÚ½Ä ÇÁ·Î¼¼½º´Â Áغñ°¡ µÇ¾úÀ½À» ¾Ë¸®±â À§Çؼ, kill ÇÔ¼ö¸¦ »ç¿ëÇØ¼ SIGUSR1 ½Ã±×³¯À» º¸³½´Ù.
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
/* SIGUSR1 ½Ã±×³¯ÀÌ µµÂøÇÒ ¶§, ÀÌ º¯¼ö¸¦ ¼³Á¤Ç϶ó */
volatile sig_atomic_t usr_interrupt = 0;
void
synch_signal (int sig)
{
usr_interrupt = 1;
}
/* ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ÀÌ ÇÔ¼ö¸¦ ½ÇÇàÇÑ´Ù. */
void
child_function (void)
{
/* Ãʱâȸ¦ ¼öÇàÇ϶ó */
printf ("I'm here!!! My pid is %d.\n", (int) getpid ());
/* Ãʱâȸ¦ ¼öÇàÇßÀ½À» ºÎ¸ð¿¡°Ô ¾Ë¸®ÀÚ */
kill (getppid (), SIGUSR1);
/* ½ÇÇàÀ» °è¼ÓÇÑ´Ù */
puts ("Bye, now....");
exit (0);
}
int
main (void)
{
struct sigaction usr_action;
sigset_t block_mask;
pid_t child_id;
/* ½Ã±×³¯ Çڵ鷯¸¦ ¸¸µé¾î¶ó. */
sigfillset (&block_mask);
usr_action.sa_handler = synch_signal;
usr_action.sa_mask = block_mask;
usr_action.sa_flags = 0;
sigaction (SIGUSR1, &usr_action, NULL);
/* ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ¸¸µé¾î¶ó */
child_id = fork ();
if (child_id == 0)
child_function (); /* ¸®ÅÏÇÏÁö ¸»¾Æ¶ó. */
/* ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ½Ã±×³¯À» º¸³¾¶§±îÁö ±â´Ù¸®ÀÚ. */
while (!usr_interrupt)
;
/* ÀÌÁ¦ ½ÇÇàÀ» °è¼ÓÇÑ´Ù. */
puts ("That's all, folks!");
return 0;
}
À§ÀÇ ¿¹Á¦´Â busy wait(Àû´çÇÑ ¸»ÀÌ ¾ø¾î¼..)À» »ç¿ëÇϴµ¥, ±×°ÍÀº ´Ù¸¥ ÇÁ·Î±×·¥¿¡¼ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï CPU »çÀÌŬÀ» ±â´Ù·Á¾ßÇϱ⠶§¹®¿¡ ÁÁÁö ¾Ê´Ù. ½Ã±×³¯ÀÌ µµÂøÇÒ¶§±îÁö ±â´Ù¸®µµ·Ï ½Ã½ºÅÛ ¿¡°Ô ºÎŹÇÏ´Â °ÍÀÌ ´õ ÁÁ´Ù. 21.8Àý [Waiting for a signal] 304 ÆäÀÌÁö¿¡ ÀÖ´Â ¿¹Á¦¸¦ ÂüÁ¶Ç϶ó.
21.7 ½Ã±×³¯ ºí·ÏÇϱâ.
½Ã±×³¯ ºí·ÏÇϱâ´Â ¿î¿µÃ¼Á¦¿¡°Ô ±× ½Ã±×³¯À» ºÙÀâ¾Æ¼ ³ªÁß¿¡ ¹è´ÞÇϵµ·Ï ¾Ë¸®´Â °ÍÀ» ÀǹÌÇÑ´Ù. ÀϹÝÀûÀ¸·Î, ÇÁ·Î±×·¥¿¡¼´Â SIG_IGNÀ» »ç¿ëÇØ¼, ½Ã±×³¯ÀÇ µ¿ÀÛÀ» ¹«½ÃÇÏ´Â °ÍÀ¸·Î ¼³Á¤ÇÒ ¸»Á¤, ºÒ¸íÈ®ÇÏ°Ô ½Ã±×³¯µéÀ» ºí·ÏÇÏÁö ¾Ê´Â´Ù. ÇÏÁö¸¸ ½Ã±×³¯ ºí·ÏÅ·(blocking)Àº ¹Î°¨ÇÑ ¿ÀÆÛ·¹À̼ǵéÀÌ ÀÎÅÍ·´Æ® µÇ´Â °ÍÀ» ¸·±â À§Çؼ ½Ã±×³¯µéÀ» ºí·ÏÇϴµ¥ »ç¿ëµÈ´Ù.
둁 ½Ã±×³¯µé ¶§¹®¿¡ Çڵ鷯¿¡ ÀÇÇØ ¼öÁ¤µÇ¾ú´ø Àü¿ª º¯¼öµéÀ» °»½Å Çϴµ¿¾È ½Ã±×³¯µéÀ» ºí·ÏÇϱâ À§Çؼ sigprocmask ÇÔ¼ö¸¦ »ç¿ë ÇÒ ¼ö ÀÖ´Ù.
둁 ƯÁ¤ÇÑ Çڵ鷯°¡ ½ÇÇàµÇ´Â µ¿¾È ¾î¶² ½Ã±×³¯µéÀ» ºí·ÏÇϵµ·Ï sigaction ÇÔ¼öÈ£Ãâ¿¡¼ sa_mask¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ÀÌ ¹æ¹ýÀ¸·Î, ½Ã±×³¯ Çڵ鷯´Â ½Ã±×³¯µé¿¡ ÀÇÇØ¼ ±× ÀÚü°¡ ÀÎÅÍ·´Æ® µÊÀÌ ¾øÀÌ ½ÇÇàµÉ ¼ö ÀÖ´Ù.
21.7.1 ¿Ö ½Ã±×³¯ ºí·ÏÅ·(Blocking)ÀÌ À¯¿ëÇѰ¡?
sigprocmaskÀ» »ç¿ëÇØ¼ ÀÓ½ÃÀûÀ¸·Î ½Ã±×³¯ ºí·ÏÇϱâ´Â ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡¼ ÀÓ°èºÎºÐ(critical parts)ÀÌ ½ÇÇàµÇ´Â µ¿¾È¿¡ ¹ß»ýÇÒÁöµµ ¸ð¸¦ ÀÎÅÍ·´Æ®¸¦ ¸·±âÀ§ÇÑ ¹æ¹ýÀ¸·Î Á¦°øµÈ´Ù. ¸¸ÀÏ ½Ã±×³¯ µéÀÌ ÇÁ·Î±×·¥ÀÇ ±× ºÎºÐ(critical parts)¿¡ µµ´ÞÇÑ´Ù¸é, ´ç½ÅÀÌ ±×µéÀÇ ºí·ÏÀ» ÇØÁ¦ÇÑ ÈÄ¿¡, ³ªÁß¿¡ ¹è´ÞµÇ¾îÁø´Ù. À̰ÍÀÇ À¯¿ëÇÑ »ç¿ë¿¹´Â ÇÁ·Î±×·¥ÀÇ ³ª¸ÓÁö¿Í ½Ã±×³¯ Çڵ鷯 »çÀÌ¿¡ µ¥ÀÌÅ͸¦ ºÐ¹è Çϴµ¥ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ¸¸ÀÏ µ¥ÀÌÅÍÀÇ Å¸ÀÔÀÌ sig_atomic_t( 21.4.7Àý [Atomic Data Access] 292 ÆäÀÌÁö ÂüÁ¶.)°¡ ¾Æ´Ï¶ó¸é ½Ã±×³¯ Çڵ鷯´Â ÇÁ·Î±×·¥ÀÇ ³ª¸ÓÁö°¡ µ¥ÀÌÅÍÀÇ Àбâ¿Í ¾²±â¸¦ ¿ÏÀüÈ÷ ³¡ ³ÂÀ» ¶§ ½ÇÇàµÉ ¼ö ÀÖ´Ù. À̰ÍÀº È¥¶õµÈ °á°ú¸¦ ÃÊ·¡ÇÒ°ÍÀÌ´Ù.
½Å·Ú°¡´ÉÇÑ ÇÁ·Î±×·¥À» ¸¸µé±â À§Çؼ, ÇÁ·Î±×·¥ÀÇ ³ª¸ÓÁö°¡ µ¥ÀÌÅ͸¦ ½ÃÇèÇϰųª °»½ÅÇÏ´Â µ¿¾È¿¡ ½Ã±×³¯ Çڵ鷯°¡ ½ÇÇàµÇ´Â °ÍÀ» ¸·À» ¼ö ÀÖ´Ù_ÇÁ·Î±×·¥ÀÇ ³ª¸ÓÁö°¡ ½ÇÇàµÇ´Â µ¿¾È ¹ß»ýÇÒ ¿©Áö°¡ ÀÖÀ¸¸ç, ±× µ¥ÀÌÅ͸¦ °Çµå¸± À§ÇèÀÌ ÀÖ´Â Àû´çÇÑ ½Ã±×³¯µéÀ» ºí·ÏÇÔÀ¸·Î ÇØ¼. ¸¸ÀÏ ¾î¶² ½Ã±×³¯ÀÌ µµÂøÇÏÁö ¾Ê¾ÒÀ» ¶§, ´ç½ÅÀÌ ¾î¶² µ¿ÀÛÀ» ¼öÇàÇϱ⸦ ¹Ù¶õ´Ù¸é ½Ã±×³¯ ºí·ÏÅ·Àº ÇÊ¿äÇÏ´Ù. ±× ½Ã±× ³¯À» À§ÇÑ Çڵ鷯°¡ sig_atomic_t ŸÀÔÀÇ Ç÷¡±×¸¦ ¼³Á¤ÇÑ´Ù°í °¡Á¤ÇÏ´Ù; ´ç½ÅÀº ±× Ç÷¡±×¸¦ ½ÃÇè ÇÏ°í ¸¸ÀÏ ±× Ç÷¡±×°¡ ¼³Á¤µÇÁö ¾Ê¾Ò´Ù¸é ¾î¶² µ¿ÀÛÀ» ¼öÇàÇϵµ·Ï ÇÏ°í ½Í¾îÇÑ´Ù. ÇÏÁö¸¸ À̰ÍÀº ½Å·ÚÇÒ ¼ö ¾ø´Ù. ¸¸ÀÏ ±× ½Ã±×³¯ÀÌ ¾ÆÁ÷ Áß¿äÇÑ µ¿ÀÛÀº ¼öÇàÇϱâ ÀüÀ̰í, Ç÷¡±×´Â Å×½ºÆ® ÇÑ Á÷ÈÄ ¿¡ ½Ã±×³¯ÀÌ ¹è´ÞµÈ´Ù°í °¡Á¤Çϸé, ±× ÇÁ·Î±×·¥Àº ½Ã±×³¯ÀÌ µµÂøÇÒÁö¶óµµ ±× µ¿ÀÛÀ» ¼öÇà ÇÒ °ÍÀÌ´Ù.
¾î¶² ½Ã±×³¯ÀÌ µµÂøÇß´ÂÁöÀÇ ¿©ºÎ¸¦ È®ÀÎÇÏ´Â À¯ÀÏÇÑ ½Å·Ú°¡´ÉÇÑ ¹æ¹ýÀº ½Ã±×³¯ÀÌ ºí·ÏµÇ¾î ÀÖÀ» µ¿¾È Å×½ºÆ®ÇÏ´Â °ÍÀÌ´Ù.
21.7.2 ½Ã±×³¯ ¼³Á¤.
½Ã±×³¯À» ºí·ÏÅ·ÇÏ´Â ÇÔ¼öµé ¸ðµÎ´Â ¹«½¼ ½Ã±×³¯µéÀÌ ¿µÇâÀ» ¹Þ°ÔµÇ´ÂÁö¸¦ Á¤ÇÏ´Â µ¥ÀÌÅÍ ±¸Á¶Ã¼ ¸¦ »ç¿ëÇÑ´Ù. ±×¸®°í, µÎ °³ÀÇ ´Ü°è, Áï, ½Ã±×³¯À» ¸¸µé±â¿Í ½Ã±×³¯À» ¶óÀ̺귯¸® ÇÔ¼ö¿¡ Àμö·Î½á »ç¿ëÇϱ⸦ Æ÷ÇÔÇÑ´Ù.
±×µéÀº Çì´õÆÄÀÏ `signal.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
µ¥ÀÌÅÍ Å¸ÀÔ : sigset__t
sigset_t µ¥ÀÌÅÍ Å¸ÀÔÀº ½Ã±×³¯ ¼Â(set)À» Ç¥ÇöÇϱâ À§Çؼ »ç¿ëµÈ´Ù. ³»ºÎÀûÀ¸·Î, Á¤¼ö³ª ±¸Á¶Ã¼ Çü À¸·Î ÀÌÇàµÉ °ÍÀÌ´Ù. À̽ļºÀ» À§Çؼ, sigset_t ¿ÀºêÁ§Æ®¿¡¼ Á¤º¸¸¦ ÃʱâÈÇϰí, º¯°æÇϰí, ÃßÃâÇÏ ´Â ¿ªÇÒÀ» ÇÏ´Â, ÀÌ Àý¿¡¼ ¼³¸íµÈ ÇÔ¼öµéÀ» »ç¿ëÇ϶ó_±×µéÀ» Á÷Á¢ÀûÀ¸·Î ´Ù·ê·Á°í ½ÃµµÇÏÁö ¸¶¶ó.
½Ã±×³¯ ¼Â(set)À» ÃʱâÈÇϱâ À§ÇÑ µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. Çϳª´Â óÀ½¿¡ sigemptysetÀ» »ç¿ëÇÏ¿© ºñ ¾îÀÖ°Ô ÇØ³õÀº´ÙÀ½, °³º°ÀûÀ¸·Î ½Ã±×³¯À» Çϳª¾¿ ´õÇÑ´Ù. ¾Æ´Ï¸é, sigfillsetÀ» »ç¿ëÇÏ¿© ¿ÏÀüÈ÷ ä¿î ´ÙÀ½, °³º°ÀûÀ¸·Î Á¤ÇØÁø ½Ã±×³¯µéÀ» Çϳª¾¿ Áö¿î´Ù.
´ç½ÅÀÌ ¾î¶²½ÄÀ¸·Îµç ±×°ÍÀ» »ç¿ëÇϱâ Àü¿¡ ±× µÎ °³ÀÇ ÇÔ¼öÁß Çϳª·Î½á ½Ã±×³¯ ¼Â(set)À» ÃʱâÈ ÇØ¾ß¸¸ ÇÑ´Ù. ¸ðµç ½Ã±×³¯µéÀ» ¸í½ÄÀûÀ¸·Î ¼³Á¤ÇÏ·Á ½ÃµµÇÏÁö ¸»¾Æ¶ó, ¿Ö³ÄÇϸé, sigset_t ¿ÀºêÁ§Æ® ´Â Ãʱâ鵃 Çʿ䰡 ÀÖ´Â ¾î¶² ´Ù¸¥ Á¤º¸(¹öÁ¯ Çʵå¿Í °°Àº)¸¦ Æ÷ÇÔÇϰí ÀÖÀ»°ÍÀ̱⠶§¹®ÀÌ´Ù. (´õ ÇÏÀÚ¸é, ´ç½ÅÀÌ ¾Ë°í ÀÖ´Â °Í¿ÜÀÇ ½Ã±×³¯Àº, ½Ã½ºÅÛÀÌ ¹ß»ý½ÃŰÁö ¾ÊÀ» °ÍÀ̶ó´Â °¡Á¤À» ´ç½ÅÀÇ ÇÁ·Î ±×·¥¾È¿¡¼ ÇÏ´Â °ÍÀº Çö¸íÇÏÁö¸øÇÏ´Ù. )
ÇÔ¼ö : int sigemptyset (sigset_t *set)
ÀÌ ÇÔ¼ö´Â Á¤ÀÇµÈ ¸ðµç ½Ã±×³¯À» Æ÷ÇÔÇϵµ·Ï ½Ã±×³¯ ¼Â(set)À» setÀ¸·Î ÃʱâÈ ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â Ç× »ó 0À» ¸®ÅÏÇÑ´Ù.
ÇÔ¼ö : int sigfillset (sigset_t *set)
ÀÌ ÇÔ¼ö´Â Á¤ÀÇµÈ ¸ðµç ½Ã±×³¯À» Æ÷ÇÔÇϵµ·Ï setÀ¸·Î ½Ã±×³¯ ¼ÂÀ» Á¤ÇÑ´Ù. ¸®ÅϰªÀº 0ÀÌ´Ù.
ÇÔ¼ö : int sigaddset (sigset_t *set, int signum)
ÀÌ ÇÔ¼ö´Â ½Ã±×³¯ ¼Â set¿¡ ½Ã±×³¯ signumÀ» ´õÇÑ´Ù. sigaddsetÀÌ ÇÏ´Â ¸ðµç °ÍÀº ¼Â(set)À» °»½ÅÇÏ ´Â °ÍÀÌ´Ù; ¾î´À ½Ã±×³¯À» ºí·ÏÇÏÁö ¾Ê°Å³ª ¶Ç´Â ºí·ÏÀ» ÇØÁ¦ÇÏÁö ¾Ê°Å³ª ÇÑ´Ù. ¸®ÅϰªÀº ¼º°øÇϸé 0ÀÌ°í ½ÇÆÐÇϸé -1ÀÌ´Ù. ´ÙÀ½ÀÇ errno´Â ÀÌ ÇÔ¼ö¸¦ À§ÇØ Á¤ÀÇµÈ ¿¡·¯ »óȲÀÌ´Ù.
EINVAL signum Àμö·Î ¹«È¿ÇÑ ½Ã±×³¯À» ÁöÁ¤ÇÏ¿´´Ù.
ÇÔ¼ö : int sigdelset (sigset_t *set, int signum)
ÀÌ ÇÔ¼ö´Â ½Ã±×³¯ ¼Â setÀ¸·ÎºÎÅÍ ½Ã±×³¯ signumÀ» Á¦°ÅÇÑ´Ù. sigdelsetÀÌ ÇÏ´Â ¸ðµç °ÍÀº ¼Â(set)À» °»½ÅÇÏ´Â °ÍÀÌ´Ù; ±×°ÍÀº ½Ã±×³¯À» ºí·ÏÇÏÁö ¾Ê°Å³ª ºí·ÏÀ» ÇØÁ¦ ÇÏÁö ¾Ê°Å³ª ÇÑ´Ù. ¸®Åϰª°ú ¿¡·¯ »óȲÀº sigaddset°ú °°´Ù.
¸¶Áö¸·À¸·Î, ½Ã±×³¯ ¼Â(set)¾È¿¡ ¾î¶² ½Ã±×³¯µéÀÌ ÀÖ´ÂÁö¸¦ Å×½ºÆ®Çϱâ À§ÇÑ ÇÔ¼öÀÇ ¼³¸íÀÌ´Ù.
ÇÔ¼ö : int sigismember (const sigset_t *set, int signum)
sigismember ÇÔ¼ö´Â ½Ã±×³¯ signumÀÌ ½Ã±×³¯ ÁýÇÕ setÀÇ ¸â¹öÀÎÁöÀÇ ¿©ºÎ¸¦ Å×½ºÆ®ÇÏ´Â ÇÔ¼öÀÌ´Ù. ¸¸ÀÏ ±× ½Ã±×³¯ÀÌ ÁýÇվȿ¡ ÀÖÀ¸¸é 1À» ¸®ÅÏÇϰí, ±×·¸Áö ¾ÊÀ¸¸é 0À» ¸®ÅÏÇϰí, ¿¡·¯°¡ ¹ß»ý
Çϸé -1À» ¸®ÅÏÇÑ´Ù. ´ÙÀ½ÀÇ errno´Â ÀÌ ÇÔ¼ö¸¦ À§ÇØ Á¤ÀÇµÈ ¿¡·¯»óȲÀÌ´Ù.
EINVAL signum Àμö¿¡ ¹«È¿ÇÑ ½Ã±×³¯ÀÌ ÁöÁ¤µÇ¾ú´Ù.
21.7.3 ÇÁ·Î¼¼½º ½Ã±×³¯ ¸¶½ºÅ©.
ÇöÀç ºí·ÏµÇ¾î ÀÖ´Â ½Ã±×³¯µéÀÇ ¸ðÀ½(collection)À» ½Ã±×³¯ ¸¶½ºÅ©¶ó°í ºÎ¸¥´Ù. °¢ ÇÁ·Î¼¼½º´Â ÀڽмÒÀ¯ÀÇ ½Ã±×³¯ ¸¶½ºÅ©¸¦ °®°í ÀÖ´Ù. ´ç½ÅÀÌ »õ·Î¿î ÇÁ·Î¼¼½º¸¦ ¸¸µé ¶§(23.4Àý [Creating a Process] 326 ÆäÀÌÁö ÂüÁ¶) ±×°ÍÀº ºÎ¸ðÀÇ ¸¶½ºÅ©¸¦ »ó¼Ó¹Þ´Â´Ù. ´ç½ÅÀº ½Ã±×³¯ ¸¶½ºÅ©¸¦ °»½ÅÇÏ¿© À¯¿¬¼ºÀÖ °Ô ½Ã±×³¯µéÀ» ºí·ÏÇϰųª ÇØÁ¦ÇÒ ¼ö ÀÖ´Ù. sigprocmask ÇÔ¼öÀÇ ÇÁ·ÎÅäŸÀÔÀº `signal.h'¿¡ ÀÖ´Ù.
ÇÔ¼ö :
int sigprocmask (int how, const sigset_t *set, sigset_t *oldset)
sigprocmask ÇÔ¼ö´Â È£ÃâµÈ ÇÁ·Î¼¼½ºÀÇ ½Ã±×³¯ ¸¶½ºÅ©¸¦ ½ÃÇèÇϰųª °»½ÅÇϴµ¥ »ç¿ëµÈ´Ù. how ÀÎ ¼ö´Â ½Ã±×³¯ ¸¶½ºÅ©¸¦ ¾î¶»°Ô º¯°æÇÒÁö Á¤ÇÏ´Â Àμö·Î½á, ´ÙÀ½°ªµéÁß¿¡ Çϳª¸¦ »ç¿ëÇØ¾ß¸¸ ÇÑ´Ù.
SIG_BLOCK set¿¡ ÀÖ´Â ½Ã±×³¯µéÀ» ºí·ÏÇ϶ó_ÇöÁ¸ÇÏ´Â ¸¶½ºÅ©¿¡ ±×µéÀ» ´õÇ϶ó. Áï, »õ·Î¿î ¸¶ ½ºÅ©´Â ÇöÁ¸ÇÏ´Â ¸¶½ºÅ©¿Í setÀÇ ÇÕÁýÇÕÀÌ´Ù.
SIG_UNBLOCK set¿¡ ÀÖ´Â ½Ã±×³¯µéÀÇ ºí·ÏÀ» ÇØÁ¦Ç϶ó_ÇöÁ¸ÇÏ´Â ¸¶½ºÅ©¿¡¼ ±×µéÀ» Á¦°ÅÇ϶ó.
SIG_SETMASK ¸¶½ºÅ©·Î setÀ» »ç¿ëÇ϶ó; ¸¶½ºÅ©ÀÇ ÀüÀÇ °ªÀº ¹«½ÃÇ϶ó.
¸¶Áö¸· Àμö oldsetÀº ¿¹Àü ÇÁ·Î¼¼½º ½Ã±×³¯ ¸¶½ºÅ©¿¡ ´ëÇÑ Á¤º¸¸¦ ¸®ÅÏÇϴµ¥ »ç¿ëµÈ´Ù. ¸¸ÀÏ ´ç ½ÅÀÌ ¿¹Àü ÇÁ·Î¼¼½º ½Ã±×³¯ ¸¶½ºÅ©¿¡ ´ëÇÑ Á¤º¸¸¦ »ìÆìº¸Áö ¾Ê°í ¸¶½ºÅ©¸¦ º¯°æÇϱ⠿øÇÑ´Ù¸é, oldset Àμö¿¡ ³Î Æ÷ÀÎÅ͸¦ »ç¿ëÇÏ¸é µÈ´Ù. À¯»çÇϰÔ, ¸¸ÀÏ ´ç½ÅÀÌ ÇöÁ¸ÇÏ´Â ¸¶½ºÅ©¸¦ º¯°æÇÏÁö ¾Ê °í, ´ÜÁö ¸¶½ºÅ©¾È¿¡ ¹«¾ùÀÌ ÀÖ´ÂÁö ¾Ë±â¸¦ ¿øÇÑ´Ù¸é, set Àμö¿¡ ³Î Æ÷ÀÎÅ͸¦ »ç¿ëÇÏ¸é µÈ´Ù. ( ÀÌ °æ¿ì, how Àμö´Â ¾Æ¹«·± Àǹ̰¡ ¾ø´Ù. ) oldset Àμö´Â ³ªÁß¿¡ ¿¹Àü ÇÁ·Î¼¼½º ½Ã±×³¯ ¸¶½ºÅ©¸¦ ¹Ý ȯÇϱâ À§ÇØ ±× ½Ã±×³¯ ¸¶½ºÅ©¸¦ ±â¾ïÇϴµ¥ Á¾Á¾ »ç¿ëµÈ´Ù. ( fork ¿Í execÀÇ È£Ãâ·Î ½Ã±×³¯ ¸¶½º Å©°¡ »ó¼ÓµÈ ÈÄ,´ç½ÅÀº ´ç½ÅÀÇ ÇÁ·Î±×·¥ÀÇ ½ÇÇàÀ» ½ÃÀÛÇÒ ¶§ ±× ¾È¿¡ ¹«½¼ ³»¿ëÀÌ ÀÖ´ÂÁö ¿¹¾ðÇÒ ¼ö ¾ø´Ù.)
È£ÃâµÈ sigprocmask°¡ ¾î´À ¹ÌÇØ°áÀÎ »óÅÂÀÇ ½Ã±×³¯ÀÇ ºí·ÏÀ» ÇØÁ¦ÇÏ°Ô µÈ´Ù¸é, ±×µé ½Ã±×³¯µéÁß Àû ¾îµµ Çϳª´Â sigprocmask°¡ ¸®ÅÏÇϱâ Àü¿¡ ÇÁ·Î¼¼½º¿¡°Ô ¹è´ÞµÈ´Ù. ¹è´ÞµÈ ¹ÌÇØ°á ½Ã±×³¯ÀÇ ¼ø¼´Â Á¤ÇØÁöÁö ¾Ê¾ÒÁö¸¸, ´ç½ÅÀÌ ÇѲ¨¹ø¿¡ ¿©·¯°³ÀÇ ½Ã±×³¯µéÀÇ ºí·ÏÀ» ÇØÁ¦Çϵµ·Ï ´ÙÁßÀÇ sigprocmaskÀ» »ç¿ëÇÔÀ¸·Î½á ¸í½ÃÀûÀ¸·Î ¼ø¼¸¦ Á¦¾îÇÒ ¼ö ÀÖ´Ù. sigprocmaskÇÔ¼ö´Â ¼º°øÇϸé 0À» ¸®ÅÏÇϰí, ½ÇÆÐ Çϸé -1À» ¸®ÅÏ ÇÑ´Ù. ´ÙÀ½ÀÇ errno´Â ÀÌ ÇÔ¼ö¸¦ À§ÇØ Á¤ÀÇµÈ ¿¡·¯»óȲÀÌ´Ù.
EINVAL how Àμö°¡ ¹«È¿ÇÏ´Ù.
´ç½ÅÀº SIGKILL °ú SIGSTOP ½Ã±×³¯µéÀ» ºí·ÏÇÒ ¼ö ¾øÁö¸¸, ¸¸ÀÏ ½Ã±×³¯ ¼ÂÀÌ ±×µéÀ» Æ÷ÇÔÇÑ´Ù¸é, sigprocmask´Â ¿¡·¯ »óȲÀ» º¸°íÇÏ´Â ´ë½Å¿¡ ±×µéÀ» ´ÜÁö ¹«½ÃÇÑ´Ù. ±â¾ïÇ϶ó, SIGFPE¿Í °°Àº ÇÁ·Î ±×·¥ ¿¡·¯ ½Ã±×³¯µéÀ» ºí·ÏÇÏ´Â °ÍÀº ½ÇÁ¦ ÇÁ·Î±×·¥ ¿¡·¯¿¡ÀÇÇØ ¹ß»ýµÈ ½Ã±×³¯·ÎÀÎÇØ ¹Ù¶÷Á÷ÇÏÁö ¸øÇÑ °á°ú¸¦ ÃÊ·¡ÇÑ´Ù. ( raise ³ª kill¿¡ ÀÇÇØ ¸¸µé¾îÁø ½Ã±×³¯µéÀº Á¦¿ÜÇϰí. ) À̰ÍÀº ½Ã±×³¯ÀÌ ´Ù ½Ã ºí·ÏÀÌ ÇØÁ¦µÇ¾úÀ» ¶§, ±× ÁöÁ¡¿¡¼ ½ÇÇàÀ» °è¼ÓÇÏÁö ¸øÇÒÁ¤µµ·Î ÇÁ·Î±×·¥ÀÌ ÆÄ±«µÇ¾ú±â ¶§¹®ÀÌ ´Ù. 21.2.1Àý [Program Erroe Signals] 273 ÆäÀÌÁö ÂüÁ¶.
21.7.4 ½Ã±×³¯ÀÇ ¹è´Þ¿©ºÎ¸¦ Å×½ºÆ®Çϱâ À§ÇÑ ºí·°Å·.
´ÙÀ½Àº °£´ÜÇÑ ¿¹Á¦ÀÌ´Ù. SIGALRM ½Ã±×³¯ÀÌ µµÂøÇÒ¶§¸¶´Ù Ç÷¡±×¸¦ ¼³Á¤ÇÏ´Â Çڵ鷯¸¦ ¸¸µé°í, ¸ÞÀÎ ÇÁ·Î±×·¥¿¡¼´Â ½Ã°£¸¶´Ù ÀÌ Ç÷¡±×¸¦ üũÇÏ°í ±×°ÍÀ» Àç ¼³Á¤ÇÑ´Ù°í °¡Á¤ÇÏÀÚ. ´ç½ÅÀº sigprocmask¸¦ È£ÃâÇØ¼ ÄÚµåÀÇ ÀÓ°èºÎºÐÀ» º¸È£ÇÔÀ¸·Î½á ±×µ¿¾È µµÂøÇÑ ºÎ°¡ÀûÀÎ SIGALRM
½Ã±×³¯À» ¸·À» ¼ö ÀÖ´Ù.
/* ÀÌ º¯¼ö´Â SIGALRM ½Ã±×³¯ Çڵ鷯¿¡ ÀÇÇØ ¼³Á¤µÈ´Ù. */
int
main (void)
{
sigset_t block_alarm;
. . .
/* ½Ã±×³¯ ¸¶½ºÅ©¸¦ ÃʱâÈÇÑ´Ù. */
sigemptyset (&block_alarm);
sigaddset (&block_alarm, SIGALRM);
while (1)
{
/* ½Ã±×³¯ÀÌ µµÂøÇß´ÂÁö¸¦ üũÇ϶ó; ¸¸ÀÏ µµÂøÇß´Ù¸é, Ç÷¡±×¸¦ Àç¼³Á¤Ç϶ó. */
sigprocmask (SIG_BLOCK, &block_alarm, NULL);
if (flag)
{
actions-if-not-arrived
flag = 0;
}
sigprocmask (SIG_UNBLOCK, &block_alarm, NULL);
. . .
}
}
21.7.5 Çڵ鷯¸¦ À§ÇÏ¿© ºí·ÏµÈ ½Ã±×³¯.
½Ã±×³¯ Çڵ鷯°¡ È£ÃâµÇ¾úÀ» ¶§, ´ç½ÅÀº º¸Åë ±× ½Ã±×³¯ Çڵ鷯°¡ ´Ù¸¥ ½Ã±×³¯¿¡ ÀÇÇØ ºí·ÏµÊÀÌ ¾ø ÀÌ ³¡³ª±â¸¦ ¿øÇÑ´Ù. ±× Çڵ鷯°¡ ½ÃÀÛµÈ ¼ø°£ºÎÅÍ ³¡³ª´Â ¼ø°£±îÁö, ´ç½ÅÀº Çڵ鷯ÀÇ µ¥ÀÌÅ͸¦ ¿À ¿°½ÃŰ°Å³ª È¥¶õ½ÃųÁöµµ ¸ð¸£´Â ½Ã±×³¯À» ºí·ÏÇØ¾ß¸¸ ÇÑ´Ù.
ÇÑ ½Ã±×³¯¿¡ ÀÇÇØ Çڵ鷯 ÇÔ¼ö°¡ È£ÃâµÇ¾úÀ» ¶§, Çڵ鷯°¡ ½ÇÇàµÇ´Â µ¿¾È ±× ½Ã±×³¯Àº ÀÚµ¿ÀûÀ¸·Î ºí·ÏµÈ´Ù ( ´Ù¸¥ ½Ã±×³¯°ú ÇÔ²² ±× ½Ã±×³¯Àº ÀÌ¹Ì ÇÁ·Î¼¼½ºÀÇ ½Ã±×³¯ ¸¶½ºÅ©¿¡ Á¸ÀçÇϰԵȴÙ.) ¸¸ ÀÏ ¿¹¸¦µé¾î ´ç½ÅÀÌ SIGTSTP¸¦ À§ÇÑ Çڵ鷯¸¦ ÁغñÇßÀ»¶§, ±× ½Ã±×³¯ÀÌ µµÂøÇϸé Çڵ鷯´Â Çڵ鷯 °¡ ½ÇÇàµÇ´Â µ¿¾È ±â´Ù¸®µµ·Ï ÇÏ¿© ³ªÁß¿¡ SIGTSTP ½Ã±×³¯À» ´Ù½Ã ¹ß»ý½ÃŲ´Ù.
±×·¸Áö¸¸, µðÆúÆ®·Î, ´Ù¸¥ Á¾·ùÀÇ ½Ã±×³¯µéÀº ºí·ÏµÇÁö ¾Ê¾Ò´Ù; ±×µéÀº Çڵ鷯°¡ ½ÇÇàµÇ´Â µ¿¾È ¹ß »ýÇÒ ¼öµµ ÀÖ´Ù. Çڵ鷯°¡ ½ÇÇàµÇ´Â µ¿¾È ´Ù¸¥ Á¾·ùÀÇ ½Ã±×³¯À» ºí·ÏÇϱâÀ§ÇÑ ÁÁÀº ¹æ¹ýÀº sigaction ±¸Á¶Ã¼ÀÇ sa_mask ¸â¹ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ´ÙÀ½Àº ±×¿¡ ´ëÇÑ ¿¹Á¦ÀÌ´Ù.
#include <signal.h>
#include <stddef.h>
void catch_stop ();
void
install_handler (void)
{
struct sigaction setup_action;
sigset_t block_mask;
sigemptyset (&block_mask);
/* Çڵ鷯°¡ ½ÇÇàµÇ´Â µ¿¾È ´Ù¸¥ Å͹̳¯-¹ß»ý ½Ã±×³¯µéÀ» ºí·ÏÇ϶ó. */
sigaddset (&block_mask, SIGINT);
sigaddset (&block_mask, SIGQUIT);
setup_action.sa_handler = catch_stop;
setup_action.sa_mask = block_mask;
setup_action.sa_flags = 0;
sigaction (SIGTSTP, &setup_action, NULL);
}
Çڵ鷯 ÄÚµå¾È¿¡¼ ¸í½ÃÀûÀ¸·Î ´Ù¸¥ ½Ã±×³¯µéÀ» ºí·ÏÇϴ°ͺ¸´Ù´Â ´õ ½Å·Ú°¡´ÉÇÏ´Ù. ¸¸ÀÏ ´ç½ÅÀÌ Çڵ鷯 ¾È¿¡¼ ¸í½ÃÀûÀ¸·Î ½Ã±×³¯µéÀ» ºí·ÏÇÑ´Ù¸é, ¾ÆÁ÷ ´ç½ÅÀÌ ±×µéÀ» ºí·ÏÇÏÁö ¾Ê¾ÒÀ», Çڵ鷯 ½Ã ÀÛ ÃʱâÀÇ ÂªÀº °£°Ýµ¿¾È¿¡ ¹ß»ýµÈ ½Ã±×³¯·Î ÀÎÇÑ ¹®Á¦´Â ÇÇÇÒ ¼ö°¡ ¾ø´Ù.
ÀÌ ¸ÞÄ«´ÏÁòÀ» »ç¿ëÇÏ¿© ÇÁ·Î¼¼½ºÀÇ ÇöÀç ¸¶½ºÅ©·ÎºÎÅÍ ½Ã±×³¯µéÀ» Á¦°Å ÇÒ ¼ö ¾ø´Ù. ±×·¸Áö¸¸, ÇÚ µé·¯ ÇÔ¼ö¿¡¼ sigprocmask¸¦ È£ÃâÇÏ¿©, ´ç½ÅÀÌ ¿øÇÏ´Â ½Ã±×³¯À» ºí·ÏÇϰųª ÇØÁ¦Çϵµ·Ï ¸¸µé ¼ö ÀÖ ´Ù. ¾î·µç, Çڵ鷯 ÇÔ¼ö°¡ ¸®ÅÏÇÒ ¶§, ½Ã½ºÅÛÀº Çڵ鷯 ÇÔ¼ö°¡ ÁøÀÔÇϱâ ÀüÀ¸·Î ¸¶½ºÅ©¸¦ ¹ÝȯÇÑ´Ù.
21.7.6 ¹ÌÇØ°á ½Ã±×³¯ üũÇϱâ.
´ç½ÅÀº sigpending À»È£ÃâÇÏ¿© ¾î´À ½ÃÁ¡¿¡¼ ¹ÌÇØ°á »óÅÂÀÎ ½Ã±×³¯µéÀ» ¹ß°ßÇØ³¾ ¼ö ÀÖ´Ù. ÀÌ ÇÔ ¼ö´Â `signal.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
ÇÔ¼ö : int sigpending (sigset_t *set)
sigpending ÇÔ¼ö´Â set¿¡ ¹ÌÇØ°áÀÎ ½Ã±×³¯¿¡ ´ëÇÑ Á¤º¸¸¦ ÀúÀåÇÑ´Ù. ¸¸ÀÏ ¹ÌÇØ°á »óÅÂÀÇ ½Ã±×³¯ÀÌ ÀÖ ´Ù¸é, ±× ½Ã±×³¯Àº ¸®ÅÏµÈ setÀÇ ¸â¹öÀÌ´Ù. (´ç½ÅÀº sigismember À» »ç¿ëÇØ¼ ƯÁ¤ÇÑ ½Ã±×³¯ÀÌ ÀÌ setÀÇ ¸â¹öÀÎÁö Å×½ºÆ® ÇÒ ¼ö ÀÖ´Ù; 21.7.2Àý [Signal Sets] 299 ÆäÀÌÁö ÂüÁ¶. ) ¼º°øÇÏ¸é ¸®ÅϰªÀº 0 ÀÌ°í ½ÇÆÐÇϸé -1ÀÌ´Ù.
½Ã±×³¯ÀÌ ¹ÌÇØ°á »óÅÂÀÎÁö¸¦ Å×½ºÆ®ÇÏ´Â °ÍÀº ÀÚÁÖ À¯¿ëÇÏÁö´Â ¾Ê´Ù. ½Ã±×³¯ÀÌ ºí·ÏµÇÁö ¾Ê¾ÒÀ» ¶§ Å×½ºÆ®ÇÏ´Â °ÍÀº ÁÁÁö¾Ê´Ù. ´ÙÀ½ÀÇ ¿¹Á¦¸¦ »ìÆìº¸ÀÚ.
#include <signal.h>
#include <stddef.h>
sigset_t base_mask, waiting_mask;
sigemptyset (&base_mask);
sigaddset (&base_mask, SIGINT);
sigaddset (&base_mask, SIGTSTP);
/* ´Ù¸¥ ÇÁ·Î¼¼½ÌÀ» ÇÏ´Â µ¿¾È¿¡ »ç¿ëÀÚ ÀÎÅÍ·´Æ®¸¦ ºí·ÏÇ϶ó. */
sigprocmask (SIG_SETMASK, &base_mask, NULL);
. . .
/* ±× ÈÄ¿¡, ¾î´À ½Ã±×³¯ÀÌ ¹ÌÇØ°áÀÎÁö¸¦ üũÇ϶ó. */
sigpending (&waiting_mask);
if (sigismember (&waiting_mask, SIGINT)) {
/* »ç¿ëÀÚ°¡ ÇÁ·Î¼¼½º¸¦ Á×À̱â±â¸¦ ½ÃµµÇÑ´Ù */
}
else if (sigismember (&waiting_mask, SIGTSTP)) {
/* »ç¿ëÀÚ°¡ ÇÁ·Î¼¼½º¸¦ ¸ØÃ߱⸦ ½ÃµµÇÑ´Ù */
}
´ç½ÅÀÇ ÇÁ·Î¼¼½º¸¦ À§ÇÏ¿© ¹ÌÇØ°á»óÅÂÀΠƯÁ¤ÇÑ ½Ã±×³¯ÀÌ ÀÖ´Ù¸é ±×µ¿¾È¿¡ µµÂøÇÑ °°Àº Á¾·ùÀÇ ºÎ °¡ÀûÀÎ ½Ã±×³¯µéÀº ¹ö·ÁÁú°ÍÀÓÀ» ±â¾ïÇ϶ó. ¿¹¸¦µé¾î, ¸¸ÀÏ SIGINT ½Ã±×³¯ÀÌ ¹ÌÇØ°á »óÅÂÀÏ ¶§ ´Ù ¸¥ SIGINT ½Ã±×³¯ÀÌ µµÂøÇϸé, ´ç½ÅÀÇ ÇÁ·Î±×·¥Àº ÀÌ ½Ã±×³¯ÀÇ ºí·ÏÀ» ÇØÁ¦ÇÒ ¶§ ¿ÀÁ÷ ÇÑ °³ÀÇ
SIGINT ½Ã±×³¯·Î ó¸®ÇÒ °ÍÀÌ´Ù.
À̽ļº ³ëÆ® : sigpending ÇÔ¼ö´Â POSIX.1¿¡ »õ·ÎÀÌ Ãß°¡µÇ¾ú´Ù. ¿À·¡µÈ ½Ã½ºÅÛµéÀº ÀÌ¿Í µ¿µîÇÑ ÇÔ¼ö°¡ ¾ø´Ù.
21.7.7 ³ªÁß¿¡ µ¿ÀÛÇϵµ·Ï ½Ã±×³¯À» ±â¾ïÇϱâ.
¶óÀ̺귯¸® ÇÔ¼ö¸¦ »ç¿ëÇØ¼ ½Ã±×³¯À» ºí·ÏÇÏ´Â ´ë½Å¿¡, ´ç½ÅÀº ´ç½ÅÀÌ ºí·ÏÀ» "ÇØÁ¦"ÇÒ ¶§, ³ªÁß¿¡ Å×½ºÆ® µÇµµ·Ï Ç÷¡±×¸¦ ¼³Á¤ÇÏ´Â Çڵ鷯¸¦ ¸¸µé¾î¼ °ÅÀÇ °°Àº °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
´ÙÀ½ÀÇ ¿¹Á¦¸¦ »ìÆìº¸¶ó.
/* ¸¸ÀÏ ÀÌ Ç÷¡±×°¡ 0ÀÌ ¾Æ´Ï¶ó¸é, Áï½Ã ±× ½Ã±×³¯À» ó¸®ÇÏÁö ¸»¾Æ¶ó. */
volatile sig_atomic_t signal_pending;
/* À̰ÍÀº ½Ã±×³¯ÀÌ µµÂøÇß°í 󸮵ÇÁö ¾Ê¾ÒÀ¸¸é 0ÀÌ ¾Æ´Ï´Ù. */
volatilesig_atomic_t defer_signal;
void
handler (int signum)
{
if (defer_signal)
signal_pending = signum;
else
. . . /* "½ÇÁ¦·Î" ±× ½Ã±×³¯À» ó¸®ÇÑ´Ù. */
}
. . .
void
update_mumble (int frob)
{
/* ½Ã±×³¯ÀÌ Áï°¢ÀûÀÎ È¿·ÂÀ» ¹ßÈÖÇÏ´Â °ÍÀ» ¸·¾Æ¶ó. */
defer_signal++;
/* ÀÎÅÍ·´¼Ç¿¡ ´ëÇÑ °ÆÁ¤¾øÀÌ, ÀÌÁ¦ mumbleÀ» °»½ÅÇÑ´Ù. */
mumble.a = 1;
mumble.b = hack ();
mumble.c = frob;
/* ¿ì¸®´Â mumbleÀ» °»½ÅÇÏ¿´´Ù. µé¾î¿ÍÀÖ´Â ¾î´À ½Ã±×³¯À» ó¸®Ç϶ó. */
defer_signal--;
if (defer_signal == 0 && signal_pending != 0)
raise (signal_pending);
}
µµÂøÇÑ Æ¯Á¤ÇÑ ½Ã±×³¯ÀÌ_¹ÌÇØ°áÀÎ_¾î¶»°Ô signal¿¡ ÀúÀåµÇ¾ú´ÂÁö¿¡ ÁÖ¸ñÇ϶ó. ±×¿Í°°Àº ¹æ¹ýÀ¸·Î, ¿ì¸®´Â ¾ÆÁ÷ ÇØ°áÇÒ ÇüÆíÀÌ µÇÁö ¾ÊÀº ½Ã±×³¯ÀÇ ´Ù¾çÇÑ Á¾·ù¸¦ ó¸®ÇÒ ¼ö ÀÖ´Ù.
¿ì¸®´Â defer_signalÀ» Áõ°¡½ÃŰ°í °¨¼Ò½ÃÄѼ ÁßøµÈ ÀÓ°è ±¸¿ª(critical sections)À» Àû´çÈ÷ ÀÛ¾÷ÇÏ °Ô ÇÑ´Ù; ±×·¡¼, ¸¸ÀÏ signal_pending °ú ÇÔ²² È£ÃâµÇ¾ú´ø update_mumble ÀÇ °ªÀÌ ÀÌ¹Ì 0ÀÌ ¾Æ´Ï¶ó ¸é, ½Ã±×³¯µéÀº update_mumble¾È¿¡¼´Â ¿¬±âµÇÁö ¾Ê°í, ¿ÀÁ÷ caller ³»ºÎ¿¡¼¸¸ ¿¬±âµÈ´Ù. À̰ÍÀº defer_signal ÀÌ ¿©ÀüÀÌ 0ÀÌ ¾Æ´Ò ¶§, ¿Ö signal_pending¸¦ üũÇÏÁö ¾Ê´ÂÁö¿¡ ´ëÇÑ ÀÌÀ¯°¡ µÈ´Ù.
defer_signal ÀÇ Áõ°¡¿Í °¨¼Ò´Â ÇÑ °³ÀÇ ¸í·Éº¸´Ù´Â ¸¹Àº ¸í·ÉÀÌ ¿ä±¸µÈ´Ù; ±×·¯¹Ç·Î Áß°£¿¡ ½Ã±×³¯ ÀÌ ¹ß»ýÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ±×·¯³ª À̰ÍÀº ¾Æ¹«·± ¹®Á¦µµ ¾ß±â½ÃŰÁö ¾Ê´Â´Ù. ¸¸ÀÏ Áõ°¡³ª °¨¼Ò¸¦ ½ÃÀÛÇϱâÀü¿¡ ¹ß»ýÇß´ø ½Ã±×³¯°ú µ¿µîÇÑ ±× ½Ã±×³¯ÀÌ Áõ°¡³ª °¨¼ÒÀü¿¡ ±× °ªÀ» º¸±âÀ§Çؼ ÃæºÐÈ÷ ¸¹ÀÌ ¹ß»ýµÈ°ÍÀ̶ó¸é, ÀÌ °æ¿ì ¾Æ¹«·± ¹®Á¦¾øÀÌ ÀÛ¾÷ÇÑ´Ù.
signal_pending À» Å×½ºÆ®Çϱâ Àü¿¡ defer_signalÀ» Áõ°¡½ÃŰ´Â °ÍÀº ±²ÀåÈ÷ Áß¿äÇÏ´Ù, ¿Ö³ÄÇϸé ÀÌ °ÍÀº ¹Î°¨ÇÑ ¹ö±×¸¦ ÇÇÇÏ°Ô Çϱ⠶§¹®ÀÌ´Ù. ¸¸ÀÏ ¿ì¸®°¡ ±×¿Í °°Àº ÀϵéÀ» ´Ù¸¥ ¼ø¼·Î ÇÑ´Ù¸é ÀÌ°Í Àº ´ÙÀ½°ú °°´Ù.
if (defer_signal == 1 && signal_pending != 0)
raise (signal_pending);
defer_singal--;
À§ÀÇ °æ¿ì if ±¸¹®°ú °¨¼Ò»çÀÌ¿¡ µµÂøµÈ ½Ã±×³¯Àº ºÒ¸íÈ®ÇÑ ½Ã°£µ¿¾ÈÀº ÀÒ¾î¹ö¸®°Ô µÈ´Ù. Çڵ鷯 ´Â ¿ÏÀüÇÏ°Ô defer_signalÀ» ¼³Á¤ÇÏ¿´Áö¸¸, ÇÁ·Î±×·¥Àº ÀÌ¹Ì ÀÌ º¯¼ö¸¦ Å×½ºÆ®Çعö·È°í, ´Ù½Ã´Â º¯¼ö ¸¦ Å×½ºÆ®ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù.
±×¿Í °°Àº ¹ö±×µéÀ» ŸÀÌ¹Ö ¿¡·¯¶ó°í ºÎ¸¥´Ù. ±×µéÀº Èñ±ÍÇÏ°Ô ¹ß»ýÇϰí Àç»ý½Ã۴µ¥´Â ±²ÀåÈ÷ Áß ¿äÇϱ⠶§¹®¿¡ ¾ÆÁÖ ³ª»Û ¹ö±×ÀÌ´Ù. ´ç½ÅÀº Àç»ý°¡´ÉÇÑ ¹ö±×¸¦ ¹ß°ßÇϴ°Íó·³ µð¹ö°Å·Î ±×µéÀ» ¹ß °ßÇҰŶó°í ¿¹»óÇÏÁö ¸¶¶ó. ±×·¸±â ¶§¹®¿¡ ±×·¯ÇÑ ¹ö±×¸¦ ÇÇÇϱâ À§Çؼ´Â Ưº°È÷ ÁÖÀÇÇÒ
°¡Ä¡°¡ ÀÖ´Ù.
( ´ç½ÅÀº ÀÌ·¯ÇÑ ¼ø¼·Î Äڵ带 ±â·ÏÇÏ°í ½ÍÀº À¯È¤À» ¹ÞÁö¸»¾Æ¶ó, defer_signal ÀÌ Ä«¿îÅÍ(counter) ·Î½á »ç¿ëµÈ´Ù¸é signal_pending °ú ÇÔ²² Å×½ºÆ®µÇ¾î¾ß¸¸ ÇÑ´Ù. ÈÄ¿¡, 0¿¡ ´ëÇÑ Å×½ºÆ®´Â 1¿¡ ´ëÇÑ Å×½ºÆ®º¸´Ù´Â ±ú²ýÇÏ´Ù. ±×·¯³ª ¸¸ÀÏ ´ç½ÅÀÌ defer_signalÀ» Ä«¿îÅÍ·Î½á »ç¿ëÇÏÁö ¾Ê°í, 0°ú 1ÀÇ °ª ¸¸ ±×°Í¿¡ ÁÖ¾îÁø´Ù¸é, ¼ø¼´Â °£´ÜÇÏ°Ô º¸¿©Áú °ÍÀÌ´Ù. À̰ÍÀº defer_signalÀ» Ä«¿îÅÍ·Î½á »ç¿ëÇÏ´Â °Íº¸´Ù ´õÇÑ À̵æÀ» °®´Â´Ù: ±×°ÍÀº ´ç½ÅÀÌ À߸øµÈ ¼ø¼·Î Äڵ带±â·ÏÇÏ°Å°í ¹Î°¨ÇÑ ¹ö±×¸¦ ¸¸µé¾î ³¾ °¡´É¼ºÀ» °¨¼Ò½Ãų °ÍÀÌ´Ù. )
21.8 ½Ã±×³¯À» À§ÇÑ ±â´Ù¸².
´ç½ÅÀÇ ÇÁ·Î±×·¥ÀÌ ¿ÜºÎ »ç°Ç¿¡ ÀÇÇØ¼ Á¶Á¾µÇ°Å³ª, µ¿±âȸ¦ À§Çؼ ½Ã±×³¯À» »ç¿ëÇÑ´Ù¸é, ±×¶§ ±× ÇÁ·Î±×·¥Àº ½Ã±×³¯ÀÌ µµÂøÇÒ¶§±îÁö ±â´Ù¸± ¼ö ¹Û¿¡ ¾ø´Ù.
21.8.1 pause »ç¿ëÇϱâ.
½Ã±×³¯ÀÌ µµÂøÇÒ¶§±îÁö ±â´Ù¸®±â À§ÇÑ °£´ÜÇÑ ¹æ¹ýÀº pause ¸¦ È£ÃâÇÏ´Â °ÍÀÌ´Ù. ´ç½ÅÀÌ ±×°ÍÀ» »ç¿ëÇϱâ Àü¿¡ ´ÙÀ½Àý¿¡ ÀÖ´Â, ±×°ÍÀ» »ç¿ëÇÔÀ¸·Î ½á ¾ò°ÔµÇ´Â ºÒ¸®ÇÑÁ¡À» º¸¾Æ¶ó.
ÇÔ¼ö : int pause ()
pause ÇÔ¼ö´Â Çڵ鷯 ÇÔ¼ö¸¦ ½ÇÇàÇϰųª, ¶Ç´Â ÇÁ·Î¼¼½º¸¦ Á¾·á ½ÃŰ´Â ½Ã±×³¯ÀÌ ¹ß»ýÇÒ¶§±îÁö ÇÁ·Î ±×·¥ÀÇ ½ÇÇàÀ» Àá½Ã ¸ØÃß´Â ¿ªÇÒÀ» ÇÏ´Â ÇÔ¼öÀÌ´Ù.
¸¸ÀÏ ±× ½Ã±×³¯ÀÌ Çڵ鷯 ÇÔ¼ö°¡ ½ÇÇàµÇµµ·ÏÇÏ´Â ¿øÀÎÀÌ µÈ´Ù¸é, pause´Â ¸®ÅÏÇÑ´Ù. À̰ÍÀº ºñ¼º°ø ÀûÀÎ ¸®ÅÏÀ¸·Î °£ÁÖÇÑ´Ù. (¿Ö³Ä¸é, "¼º°øÀû"ÀÎ ÇൿÀº ¿µ¿øÈ÷ ÇÁ·Î±×·¥À» ¸ØÃßµµ·Ï ÇÒ°ÍÀ̱⠶§¹®ÀÌ ´Ù.) ±×·¸±â ¶§¹®¿¡ -1À» ¸®ÅÏÇÑ´Ù. ½ÉÁö¾î ´ç½ÅÀÌ ½Ã½ºÅÛ Çڵ鷯°¡ ¸®ÅÏÇÒ ¶§ ´Ù¸¥ ±âº»µ¿ÀÛ (primitives)À» Àç½ÃÀÛÇϵµ·Ï Á¤ÇÑ´Ù°íÇØµµ ( 21.5Àý [Interrupted Primitives], 293 ÆäÀÌÁö ÂüÁ¶.), ÀÌ°Í Àº pause¿¡ ¾Æ¹«·± ¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê´Â´Ù; ±×°ÍÀº ½Ã±×³¯ÀÌ Ã³¸®µÉ ¶§ Ç×»ó ½ÇÆÐÇÑ´Ù. ´ÙÀ½ÀÇ errno ´Â ÀÌ ÇÔ¼ö¸¦ À§ÇØ Á¤ÀÇµÈ ¿¡·¯ »óȲÀÌ´Ù.
EINTR ±× ÇÔ¼ö°¡ ½Ã±×³¯ÀÇ ¹è´Þ·Î ÀÎÇØ¼ ÀÎÅÍ·´Æ® µÇ¾ú´Ù.
¸¸ÀÏ ±× ½Ã±×³¯ÀÇ ÇÁ·Î±×·¥ Á¾·áÀÇ ¿øÀÎÀÌ µÈ´Ù¸é, pause´Â ¸®ÅÏ ÇÏÁö ¾Ê´Â´Ù(¸í¹éÇϰÔ). pause ÇÔ ¼ö´Â `unistd.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
21.8.2 pause »ç¿ëÀÇ ¹®Á¦µé.
pauseÀÇ °£´ÜÇÔÀº ÇÁ·Î±×·¥À» ÀÌ»óÇÏ°Ô Áß´Ü(hang) ½Ãų¼öµµ ÀÖ´Â ½É°¢ÇÑ Å¸ÀÌ¹Ö ¿¡·¯µéÀ» ¼û±æ¼ö µµ ÀÖ´Ù. ¸¸ÀÏ ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡¼, ½ÇÁ¦ ÀÛ¾÷ÀÌ ½Ã±×³¯ Çڵ鷯¿¡ ÀÇÇØ¼ ¼öÇàµÇ°í, "¸ÞÀÏ ÇÁ·Î±×·¥ "Àº pause´Â È£ÃâÇÏÁö¸¸ ¾Æ¹«·± ÀÏÀ» ÇÏÁö ¾ÊÀ»¶§´Â ¾ÈÀüÇÏ´Ù. ½Ã±×³¯ÀÌ ¹è´ÞµÉ¶§¸¶´Ù, Çڵ鷯´Â ÇØ ¾ßÇÒ ÀÛ¾÷À» Çϰí, ´ÙÀ½¿¡ ¸®ÅÏÇÑ´Ù, ±×·¡¼ ÇÁ·Î±×·¥ÀÇ ¸ÞÀÎ ·çÇÁ´Â ´Ù½Ã pause¸¦ È£Ãâ ÇÒ ¼ö ÀÖ´Ù.
ÇÑ °³ ÀÌ»óÀÇ ½Ã±×³¯ÀÌ µµÂøÇϱ⸦ ±â´Ù·È´Ù°¡ ½ÇÁ¦ÀÛ¾÷À» Àç°³ÇϱâÀ§Çؼ pause¸¦ »ç¿ëÇÏ´Â °ÍÀº ¾ÈÀüÇÒ ¼ö ¾ø´Ù. ´ç½ÅÀÌ Ç÷¡±×¸¦ ¼³Á¤ÇÏ´Â °ÍÀ¸·Î ½Ã±×³¯ Çڵ鷯¸¦ Á¶Á¤ÇÑ´Ù°í ÇÒÁö¶óµµ, ´ç½ÅÀº ¿©ÀüÈ÷ pauseÇÔ¼ö¸¦ ¹ÏÀ» ¼ö ¾ø´Ù. ´ÙÀ½¿¡ À̹®Á¦¿¡ ´ëÇÑ ¿¹Á¦°¡ ÀÖ´Ù.
/* usr_interrupt´Â ½Ã±×³¯ Çڵ鷯¿¡ ÀÇÇØ ¼³Á¤µÈ´Ù. */
if (!usr_interrupt)
pause ();
/* ½Ã±×³¯ÀÌ µµÂøÇßÀ» ¶§ ÀÛ¾÷Ç϶ó. */
. . .
À̰ÍÀº ¹ö±×¸¦ °®°í ÀÖ´Ù: º¯¼ö usr_interrupt°¡ üũµÈ ÈÄ, ÇÏÁö¸¸ pause°¡ È£ÃâµÇ±âÀü¿¡ ½Ã±×³¯ ÀÌ µµÂøÇÒ ¼ö ÀÖ´Ù. ¸¸ÀÏ ¾ÕÀ¸·Î ¾Æ¹«·± ½Ã±×³¯ÀÌ µµÂøÇÏÁö ¾ÊÀ¸¸é, ÇÁ·Î¼¼½º´Â °áÄÚ ´Ù½Ã´Â Àç°³µÉ ¼ö ¾ø´Ù. puase¸¦ »ç¿ëÇÏ´Â ´ë½Å¿¡ ·çÇÁ¾È¿¡¼ sleep¸¦ »ç¿ëÇØ¼ ¿À·£ ±â´Ù¸²¿¡ »óÀ§(upper) Á¦ÇÑÀ» °¡ÇÒ¼ö ÀÖ´Ù. (sleep¿¡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸´Â 17.4Àý [Sleeping], 244 ÆäÀÌÁö¸¦ ÂüÁ¶Ç϶ó. ) ´ÙÀ½ÀÇ ¿¹ Á¦¸¦ º¸ÀÚ.
/* usr_interrupt´Â ½Ã±×³¯ Çڵ鷯¿¡ ÀÇÇØ ¼³Á¤µÈ´Ù. */
while (!usr_interrupt)
sleep (1);
/* ½Ã±×³¯ÀÌ µµÂøÇÒ ¶§ ÀÛ¾÷Ç϶ó. */
. . .
¾î¶² ¸ñÀûÀ¸·Îµµ, À̰ÍÀº »ç¿ëÇϱ⿡ ÃæºÐÇÏ´Ù. Á¶±Ý ´õ º¹ÀâÇϱâ´Â ÇÏÁö¸¸, sigsuspend¸¦ »ç¿ëÇØ ¼µµ ƯÁ¤ÇÑ Çڵ鷯°¡ ½ÇÇàµÇ´Â µ¿¾È È®½ÇÇÏ°Ô ±â´Ù¸± ¼ö ÀÖ´Ù.
21.8.3 sigsuspend »ç¿ëÇϱâ.
½Ã±×³¯ÀÌ µµÂøÇϱ⸦ ±â´Ù¸®´Â ±ú²ýÇÏ°í ½Å·Ú°¡´ÉÇÑ ¹æ¹ýÀº ±×°ÍÀ» ºí·ÏÇϰí sigsuspend¸¦ »ç¿ëÇÏ ´Â °ÍÀÌ´Ù. ·çÇÁ¾È¿¡¼ »ç¿ëµÈ sigsuspend´Â, ´Ù¸¥ Á¾·ùÀÇ ½Ã±×³¯µéÀÌ ±×µéÀÇ Çڵ鷯¿¡ ÀÇÇØ ó¸® µÇ´Â µ¿¾È, ¾î¶² Á¾·ùÀÇ ½Ã±×³¯À» À§Çؼ ±â´Ù¸± ¼ö ÀÖ´Ù.
ÇÔ¼ö : int sigsuspend (const sigset_t *set)
ÀÌ ÇÔ¼ö´Â setÀ¸·Î ÇÁ·Î¼¼½ºÀÇ ½Ã±×³¯ ¸¶½ºÅ©¸¦ ´ëüÇϰí, ÇÁ·Î¼¼½º¸¦ Á¾·á½ÃŰ°Å³ª, ½Ã±×³¯ ó¸® ÇÔ ¼ö¸¦ È£ÃâÇÏ´Â µ¿ÀÛÀ» ÇÏ´Â ½Ã±×³¯ÀÌ ¹è´ÞµÉ¶§±îÁö ÇÁ·Î¼¼½º¸¦ ÁßÁö½ÃŲ´Ù. Áï, ÇÁ·Î±×·¥Àº setÀÇ ¸â¹ö°¡ ¾Æ´Ñ ½Ã±×³¯ÁßÀÇ Çϳª°¡ µµÂøÇÒ¶§±îÁö ÁßÁöµÈ´Ù.
¸¸ÀÏ ¾î¶² ÇÁ·Î¼¼½º°¡ Çڵ鷯 ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ½Ã±×³¯ÀÇ ¹è´Þ·Î ÀÎÇØ¼ Àç°³µÇ¸é, ±× Çڵ鷯 ÇÔ¼ö´Â ¸®ÅÏÇϰí, sigsuspend ¶ÇÇÑ ¸®ÅÏÇÑ´Ù. ¸¶½ºÅ©´Â sigsuspend°¡ ±â´Ù¸®°í ÀÖ´Â µ¿¾È¸¸ setÀ¸·Î À¯ÁöµÈ ´Ù. sigsuspend ÇÔ¼ö´Â ¸®ÅÏÇÒ ¶§ Ç×»ó ÀüÀÇ ½Ã±×³¯ ¸¶½ºÅ©¸¦ ¹ÝȯÇÑ´Ù. ¸®Åϰª°ú ¿¡·¯»óȲÀº pause¿Í °°´Ù.
sigsuspend¸¦ »ç¿ëÇØ¼, ¾ÕÀý¿¡¼ ³ª¿Â pause¿Í sleep¸¦ ¿ÏÀüÇÏ°Ô ´ëüÇÒ ¼ö ÀÖ´Ù.
sigset_t mask, oldmask;
. . .
/* ÀϽÃÀûÀ¸·Î ºí·ÏÇÒ ½Ã±×³¯µéÀÇ ¸¶½ºÅ©¸¦ ÁغñÇ϶ó. */
sigemptyset (&mask);
sigaddset (&mask, SIGUSR1);
. . .
/* ½Ã±×³¯ÀÌ µµÂøÇϱ⸦ ±â´Ù·Á¶ó. */
sigprocmask (SIG_BLOCK, &mask, &oldmask);
while (!usr_interrupt)
sigsuspend (&oldmask);
sigprocmask (SIG_UNBLOCK, &mask, NULL);
ÄÚµåÀÇ ¸¶Áö¸· ºÎºÐÀº ¾à°£ ±³¹¦ÇÏ´Ù. À̰ÍÀÇ ÇÙ½ÉÀº sigsuspend°¡ ¸®ÅÏ ÇÒ ¶§, ÇÁ·Î¼¼½º°¡ ¿ø·¡ °¡Á³´ø ½Ã±×³¯ ¸¶½ºÅ©ÀÇ °ªÀ¸·Î Àç¼³Á¤ÇÏ´Â °ÍÀÌ´Ù. ÀÌ °æ¿ì, SIGUSR1 ½Ã±×³¯ÀÌ ´Ù½Ã ºí·ÏµÇ¾îÁø ´Ù. sigprocmaskÀÇ µÎ ¹øÂ° È£ÃâÀº ÀÌ ½Ã±×³¯ÀÇ ºí·ÏÀ» ¸í¹éÇÏ°Ô ÇØÁ¦ÇÒ Çʿ䰡 ÀÖ´Ù.
´Ù¸¥ Æ÷ÀÎÆ® : ¿ÀÁ÷ ÇϳªÀÇ SIGUSR1 ½Ã±×³¯À» ±â´Ù¸®´Â ±× ÇÁ·Î±×·¥¿¡¼ ¿Ö while ·çÇÁ°¡ ÇÊ¿äÇÑ Áö ÀǾÆÇØ ÇÒÁö ¸ð¸¥´Ù. ±× ´ë´äÀº, sigsuspend¿¡ ÁÖ¾îÁö´Â ¸¶½ºÅ©°¡, ¿¹¸¦µé¾î, ÀÛ¾÷ Á¦¾î ½Ã±× ³¯Ã³·³ ´Ù¸¥ Á¾·ùÀÇ ½Ã±×³¯ÀÌ ¹è´ÞµÊÀ¸·Î ÀÎÇØ¼ ±¸µ¿µÇ¾îÁú ÇÁ·Î¼¼½º¸¦ Çã°¡ÇÑ´Ù´Â °ÍÀÌ´Ù. ¸¸ÀÏ usr_interrput¸¦ ¼³Á¤ÇÏÁö ¾ÊÀº ½Ã±×³¯¿¡ ÀÇÇØ ÇÁ·Î¼¼½º°¡ Àç°³µÈ´Ù¸é, ±×°ÍÀº ´ÜÁö "¿Ã¹Ù¸¥" Á¾·ù ÀÇ ½Ã±×³¯ÀÌ ¹ß»ýÇÒ¶§±îÁö ´Ù½Ã ÁßÁöµÈ´Ù. ÀÌ Å×Å©´ÐÀº ÁغñÀÛ¾÷¿¡ ´õ ³ºÀº ¶óÀÎÀÌ ÇÊ¿äÇÏÁö¸¸, ´ç½ÅÀÌ ½Ã±×³¯¿¡ ´ëÇÑ Á¤È®ÇÑ ±â´Ù¸²À» À§Çؼ´Â ÇÊ¿äÇÏ´Ù. ½ÇÁ¦·Î ±â´Ù¸²À» À§ÇÑ ÄÚµå´Â ´ÜÁö 4 ÁÙ»ÓÀÌ´Ù.
21.9 BSD ½Ã±×³¯ ÇØµé¸µ.
ÀÌ ÀýÀº BSD À¯´Ð½º¿¡¼ ¿Â ½Ã±×³¯ Çڵ鸵 ÇÔ¼öµé¿¡ ´ëÇØ¼ ¼³¸íÇÑ´Ù. ÀÌµé µµ±¸µéÀº ±×µéÀÇ ½Ã´ë ¿¡¼´Â Áøº¸ÀûÀÌ¿´Áö¸¸; ¿À´Ã³¯Àº ±²ÀåÈ÷ ½Ã´ë¿¡ µÚ¶³¾îÁø°ÍÀ̰í, ¿ÀÁ÷ BSD¿ÍÀÇ È£È¯¼ºÀ» À§Çؼ Á¦°øµÇ°í ÀÖ´Ù.
21.9.1 POSIX ¿Í BSD ½Ã±×³¯ ±â´Éµé.
POSIX ½Ã±×³¯ ó¸® ±â´ÉµéÀº BSD ±â´Éµé·ÎºÎÅÍ ³ª¿Â°ÍÀ̱⠶§¹®¿¡ BSD¿Í POSIX ½Ã±×³¯ ó¸® ±â´Éµé »çÀÌ¿¡´Â ¸¹Àº À¯»ç¼ºÀÌ ÀÖ´Ù. Ãæµ¹À» ÇÇÇϱâ À§Çؼ ¸ðµç ÇÔ¼öµéÀÌ ¼·Î ´Ù¸¥ À̸§À» °®°í ÀÖ´Ù´Â °ÍÀ» Á¦¿ÜÇϰí, µÑ »çÀÌ¿¡´Â ÁÖ¿äÇÑ Â÷À̵éÀÌ ÀÖ´Ù.
둁 BSD À¯´Ð½º´Â sigset_t ¿ÀºêÁ§Æ®·Î ½Ã±×³¯ ¸¶½ºÅ©¸¦ ³ªÅ¸³»´Â °ÍÀÌ ¾Æ´Ï¶ó int ºñÆ® ¸¶½ºÅ©·Î½á ½Ã±×³¯ ¸¶½ºÅ©¸¦ Ç¥ÇöÇÑ´Ù.
둁 BSD ±â´ÉµéÀº ÀÎÅÍ·´Æ®µÈ ±âº»µ¿ÀÛ(primitive)À» ½ÇÆÐÇÏ°Ô ÇÒ°ÍÀÎÁö Àç°³ÇÒ°ÍÀÎÁöÀÇ ¿©ºÎ¿¡ ´ëÇØ ¼ ´Ù¸¥ µðÆúÆ®¸¦ »ç¿ëÇÑ´Ù. POSIX ±â´ÉÀº ´ç½ÅÀÌ ±×µéÀ» Àç°³Çϵµ·Ï Á¤ÇÒÁö¶óµµ ½Ã½ºÅÛ È£ÃâÀÌ ½Ç ÆÐÇÏ°Ô ¸¸µé°í, BSD ±â´ÉµéÀº, ´ç½ÅÀÌ ±×µéÀ» ½ÇÆÐÇϵµ·Ï Á¤ÇßÀ»Áö¶óµµ ½Ã½ºÅÛ È£ÃâÀº ±×°ÍÀ» Àç°³ Çϵµ·Ï ¸¸µå´Â °ÍÀÌ´Ù. 21.5Àý [Interrupted Primitives], 293 ÆäÀÌÁö ÂüÁ¶.
둁 BSD À¯´Ð½º´Â ½Ã±×³¯ ½ºÅÃÀÇ ±¸»óÀ» °®´Â´Ù. À̰ÍÀº º¸ÅëÀÇ ½ÇÇà ½ºÅôë½Å¿¡, ½Ã±×³¯ Çڵ鷯 ÇÔ¼öµéÀÇ ½ÇÇൿ¾È¿¡ »ç¿ëµÇ´Â ´ëü½ºÅà (alternate stack)ÀÌ´Ù.
BSD ±â´ÉµéÀº `signal.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
21.10 Çڵ鷯 ÇÔ¼ö¸¦ ¸¸µé±â À§ÇÑ BSD ÇÔ¼ö.
µ¥ÀÌÅÍŸÀÔ : struct sigvec
ÀÌ µ¥ÀÌÅÍ Å¸ÀÔÀº struct sigaction°ú µ¿µîÇÑ °ÍÀÌ´Ù( 21.3.2Àý [Advanced Signal Handling] 281 ÆäÀÌ Áö ÂüÁ¶); À̰ÍÀº sigvecÇÔ¼ö¿¡¼ ½Ã±×³¯ µ¿ÀÛÀ» ÁöÁ¤Çϱâ À§Çؼ »ç¿ëµÈ´Ù. ±×°ÍÀº ´ÙÀ½°ú °°Àº ¸â ¹öµéÀ» Æ÷ÇÔÇϰí ÀÖ´Ù.
sighandler_t sv_handler
À̰ÍÀº Çڵ鷯 ÇÔ¼öÀÌ´Ù.
int sv_mask
À̰ÍÀº Çڵ鷯 ÇÔ¼ö°¡ È£ÃâµÇ¾îÀÖÀ» µ¿¾È¿¡ ºí·ÏµÉ ºÎ°¡ÀûÀÎ ½Ã±×³¯µéÀÇ ¸¶½ºÅ©ÀÌ´Ù.
int sv_flags
À̰ÍÀº ½Ã±×³¯ÀÇ µ¿ÀÛ¿¡ ¿µÇâÀ» ¹ÌÄ¡´Â ´Ù¾çÇÑ Ç÷¡±×¸¦ Á¤Çϴµ¥ »ç¿ëµÇ´Â ºñÆ®¸¶½ºÅ©ÀÌ´Ù. ´ç½ÅÀº sv_onstack·Î¼ ÀÌ Çʵ带 ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù.
±×µé ±âÈ£ »ó¼öµéÀº sigvec ±¸Á¶Ã¼ÀÇ sv_flags ¸¦ À§ÇØ Á¦°øµÇ´Â °ªµé·Î »ç¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ ÇÊµå ´Â ºñÆ® ¸¶½ºÅ© °ªÀ̷νá, ´ç½ÅÀÌ °ü½ÉÀ» °®´Â Ç÷¡±×µéÀ» ºñÆ®º°-OR¸¦ »ç¿ëÇØ¼ °áÇÕÇÒ ¼ö ÀÖ´Ù.
¸ÅÅ©·Î : int SV__ONSTACK
¸¸ÀÏ ÀÌ ºñÆ®°¡ ±¸Á¶Ã¼ sigvecÀÇ sv_flags¿¡¼ ¼³Á¤µÇ¸é, ±×°ÍÀº ½Ã±×³¯ÀÌ ¹è´ÞµÇ¾úÀ» ¶§ ½Ã±×³¯ ½º ÅÃÀ» »ç¿ëÇÏ´Â °ÍÀ» ÀǹÌÇÑ´Ù.
¸ÅÅ©·Î : int SV__INTERRUPT
¸¸ÀÏ ÀÌ ºñÆ®°¡ sigvec ±¸Á¶Ã¼ÀÇ sv_flags¾È¿¡¼ ¼³Á¤µÇ¸é, ÀÌ·¯ÇÑ Á¾·ùÀÇ ½Ã±×³¯¿¡ ÀÇÇØ ÀÎÅÍ·´Æ®µÈ ½Ã½ºÅÛ È£ÃâÀº Çڵ鷯°¡ ¸®ÅÏÇØµµ Àç½ÃÀÛµÇÁö ¾ÊÀ»°ÍÀÓÀ» ÀǹÌÇÑ´Ù; ´ë½Å¿¡ ½Ã½ºÅÛ È£ÃâÀº EINTR ¿¡·¯ »óȲÀ¸·Î ¸®ÅÏÇÒ °ÍÀÌ´Ù. 21.5Àý [Interrupted Primitives] 293 ÆäÀÌÁö ÂüÁ¶.
¸ÅÅ©·Î : int SV__RESETHAND
¸¸ÀÏ ÀÌ ºñÆ®°¡ sigvec ±¸Á¶Ã¼ÀÇ sv_flags¿¡¼ ¼³Á¤µÇ¸é, ½Ã±×³¯À» ¹Þ¾ÒÀ» ¶§, SIG_DFL·Î ¿ø·¡ÀÇ ½Ã ±×³¯À» À§ÇÑ µ¿ÀÛÀ¸·Î Àç¼³Á¤ÇÏ´Â °ÍÀ» ÀǹÌÇÑ´Ù.
ÇÔ¼ö :
int sigvec (int signum, const struct sigvec *action,struct sigvec *old_action)
ÀÌ ÇÔ¼ö´Â sigaction (21.3.2Àý [Acvanced Signal Handling] 281ÆäÀÌÁö ÂüÁ¶.)°ú °°´Ù; ±×°ÍÀº ½Ã±×³¯ signum¿¡ ´ëÇÑ µ¿ÀÛÀ» actionÀ¸·Î Çϰí, old_action¿¡ ±× ½Ã±×³¯ÀÇ ¿¹Àü µ¿ÀÛ¿¡ ´ëÇÑ Á¤º¸¸¦ ¸®ÅÏÇÑ ´Ù.
ÇÔ¼ö : int siginterrupt (int signum, int failflag)
ÀÌ ÇÔ¼ö´Â ¾î¶² ±âº»µ¿ÀÛÀÌ ½Ã±×³¯ signum¿¡ ÀÇÇØ ÀÎÅÍ·´Æ® µÇ¾úÀ» ¶§, »ç¿ëÇÒ Á¢±Ù¹ýÀ» ÁöÁ¤ÇÑ´Ù. ¸¸ÀÏ failflag°¡ falseÀ̸é, ½Ã±×³¯ signumÀº ±âº»µ¿ÀÛÀ» ´Ù½Ã½ÃÀÛÇÑ´Ù. ¸¸ÀÏ failflag°¡ trueÀ̸é, ó ¸®µÇ´Â signumÀº ¿¡·¯ÄÚµå EINTR·Î ±×µé ±âº»µ¿ÀÛÀ» ½ÇÆÐÇÏ°Ô ÇÑ´Ù. 21.5Àý [Interrupted Primitives] 293 ÆäÀÌÁö ÂüÁ¶.
21.10.1 ºí·ÏµÈ ½Ã±×³¯À» À§ÇÑ BSD ÇÔ¼öµé.
¸ÅÅ©·Î : int sigmask (int signum)
ÀÌ ¸ÅÅ©·Î´Â ½Ã±×³¯ signumÀ» À§ÇÑ ºñÆ®¸¦ °¡Áø ½Ã±×³¯ ¸¶½ºÅ©¸¦ ¸®ÅÏÇÑ´Ù. ´ç½ÅÀº ¿©·¯°³ÀÇ ½Ã±× ³¯À» Á¤ÇØÁÖ±â À§Çؼ ºñÆ®º°-OR ¿¬»êÀÚ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Ã³·³.
(sigmask (SIGTSTP) | sigmask (SIGSTOP)
| sigmask (SIGTTIN) | sigmask (SIGTTOU))
À̰ÍÀº ¸ðµç ÀÛ¾÷-Á¦¾î ½Ã±×³¯Áß stop ½Ã±×³¯µéÀ» Æ÷ÇÔÇÏ´Â ¸¶½ºÅ©¸¦ ÁöÁ¤ÇÑ´Ù.
ÇÔ¼ö : int sigblock (int mask)
ÀÌ ÇÔ¼ö´Â how Àμö¸¦ SIG_BLOCK·Î °¡Áø, sigprocmask( 21.7.3Àý [Process Signal Mask] 300 Æä ÀÌÁö ÂüÁ¶)°ú °°´Ù: ±×°ÍÀº È£ÃâµÈ ÇÁ·Î¼¼½ºÀÇ ºí·ÏµÈ ½Ã±×³¯ÀÇ ÁýÇÕ¿¡, mask¿¡ ÀÇÇØ Á¤ÇØÁø ½Ã±×³¯ µéÀ» ´õÇÑ´Ù. ¸®ÅϰªÀº ÀüÀÇ ºí·ÏµÈ ½Ã±×³¯µéÀÇ ÁýÇÕÀÌ´Ù.
ÇÔ¼ö : int sigsetmask (int mask)
ÀÌ ÇÔ¼ö´Â how Àμö°¡ SIG_SETMASK ÀÎ, sigprocmask¿Í (21.7.3Àý [Process Signal Mask] 300 Æä ÀÌÁö ÂüÁ¶.) °°´Ù: ±×°ÍÀº È£ÃâµÈ ÇÁ·Î¼¼½ºÀÇ ½Ã±×³¯ ¸¶½ºÅ©¸¦ setÀ¸·Î Á¤ÇÑ´Ù. ¸®ÅϰªÀº ÀüÀÇ ºí·Ï µÈ ½Ã±×³¯µéÀÌ ÁýÇÕÀÌ´Ù.
ÇÔ¼ö : int sigpause (int mask)
ÀÌ ÇÔ¼ö´Â sigsuspend(21.8 [Waiting for a Signal] 304 ÆäÀÌÁö ÂüÁ¶.) °ú °°´Ù: È£ÃâµÈ ÇÁ·Î¼¼½ºÀÇ ½Ã±×³¯ ¸¶½ºÅ©¸¦ mask·Î ¼³Á¤Çϰí, ½Ã±×³¯ÀÌ µµÂøÇϱ⸦ ±â´Ù¸°´Ù. ¸®ÅÏÇÒ ¶§ ÀüÀÇ ºí·ÏµÈ ½Ã±×³¯ÀÇ ÁýÇÕÀº ´Ù½Ã ¹ÝȯµÈ´Ù.
21.10.2 ºÐ¸®µÈ ½Ã±×³¯ ½ºÅà »ç¿ëÇϱâ.
½Ã±×³¯ ½ºÅÃÀº ½Ã±×³¯ Çڵ鷯°¡ ½ÇÇàµÇ´Â µ¿¾È ½ÇÇà ½ºÅÃÀ¸·Î½á »ç¿ëµÇ´Â ¸Þ¸ð¸®ÀÇ Æ¯º°ÇÑ ¿µ¿ªÀÌ ´Ù. ¿À¹öÇ÷ο찡 ÀϾ À§ÇèÀ» ÇÇÇϱâ À§Çؼ´Â, ²Ï Ä¿¾ßÇÑ´Ù; ¸ÅÅ©·Î SIGSTKSZ´Â ½Ã±×³¯ ½ºÅà À» À§ÇÑ Á¤±Ô Å©±â·Î Á¤ÀÇ µÇ¾ú´Ù. ´ç½ÅÀº mallocac À» »ç¿ëÇØ¼ ½ºÅÃÀ» À§ÇÑ °ø°£À» ÇÒ´çÇÒ ¼ö ÀÖ ´Ù. ±×¸®°í³ª¼ sigaltstack À̳ª stgstack¸¦ È£ÃâÇÏ¿© ½Ã±×³¯ ½ºÅÃÀ» »ç¿ëÇϵµ·Ï ½Ã½ºÅÛ¿¡°Ô ¾Ë¸°´Ù.
´ç½ÅÀÌ ½Ã±×³¯ ½ºÅÃÀ» »ç¿ëÇϱâ À§Çؼ ½Ã±×³¯ Çڵ鷯¸¦ ´Þ¸® ¸¸µé ÇÊ¿ä´Â ¾ø´Ù. ´Ù¸¥°Í¿¡¼ ½ºÅà À¸·ÎÀÇ º¯°æÀº ÀÚµ¿ÀûÀ¸·Î ¹ß»ýÇÑ´Ù. ±×·¸Áö¸¸, ¾î¶² ±â°è»ó¿¡ Á¸ÀçÇÏ´Â ¾î¶² µð¹ö°Å´Â ½Ã±×³¯ ½ºÅà À» »ç¿ëÇÏ´Â Çڵ鷯°¡ ½ÇÇàµÇ´Â µ¿¾È ½ºÅà Ʈ·¡À̽º(trace)¸¦ Çϸé È¥¶õ½º·´°Ô µÉÁöµµ ¸ð¸¥´Ù.
ºÐ¸®µÈ ½Ã±×³¯ ½ºÅÃÀ» »ç¿ëÇϵµ·Ï ½Ã½ºÅÛ¿¡°Ô ¾Ë¸®±â À§ÇÑ µÎ °³ÀÇ ÀÎÅÍÆäÀ̽º°¡ ÀÖ´Ù. sigstackÀº ¿À·¡µÈ ÀÎÅÍÆäÀ̽º·Î½á 4.2 BSD ·ÎºÎÅÍ ¿Ô´Ù. sigaltstackÀº »õ·Î¿î ÀÎÅÍÆäÀ̽º·Î½á 4.4 BSD ·ÎºÎ ÅÍ ¿Ô´Ù. sigaltstack ÀÎÅÍÆäÀ̽º´Â ½ºÅÃÀÇ ¼ºÀå ¹æÇâÀ» ¾Ë¸®µµ·Ï ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡°Ô ¿ä±¸ÇÏÁö ¾Ê °í, Á¤ÇØÁø ±â°è¿Í ¿î¿µÃ¼Á¦¿¡ ÀÇÁ¸ÇÑ´Ù´Â Æí¸®Á¡À» °®´Â´Ù.
µ¥ÀÌÅÍ Å¸ÀÔ : struct sigaltstack
ÀÌ ±¸Á¶Ã¼´Â ½Ã±×³¯ ½ºÅÃÀ» ¼³¸íÇÑ´Ù. ±×°ÍÀº ´ÙÀ½ÀÇ ¸â¹öµéÀ» Æ÷ÇÔÇϰí ÀÖ´Ù:
void *ss_sp
À̰ÍÀº ½Ã±×³¯ ½ºÅÃÀÇ ±âÁØ(base)À» °¡¸®Å²´Ù.
size_t ss_size
`ss_sp'°¡ °¡¸®Å°´Â ½Ã±×³¯ ½ºÅÃÀÇ Å©±â(¹ÙÀÌÆ®)ÀÌ´Ù. ´ç½ÅÀÌ ½ºÅÃÀ» À§ÇÑ °ø°£À» ¾ó¸¶³ª ¸¹ÀÌ ÇÒ °ÍÀÎÁö¸¦ Á¤ÇÑ´Ù. ´ÙÀ½ µÎ °³ÀÇ ¸ÅÅ©·Î´Â `signal.h'¿¡ Á¤ÀǵǾî ÀÖ°í, ´ç½ÅÀº À̰ÍÀº °è»êµÈ Å©±â·Î ½á »ç¿ëÇÒ °ÍÀÌ´Ù.
SIGSTKSZ À̰ÍÀº ½Ã±×³¯ ½ºÅÃÀ» À§ÇÑ Á¤±Ô Å©±âÀÌ´Ù. À̰ÍÀº º¸Åë »ç¿ëÇϱâ À§Çؼ ±Ô°ÝÈ µÈ ¿ë·®À» °®´Â´Ù.
MINSIGSTKSZ
À̰ÍÀº ´ÜÁö ¿î¿µÃ¼Á¦°¡ ½Ã±×³¯ ¹è´ÞÀ» ¼öÇàÇϱâ À§Çؼ ÇÊ¿äÇÑ ½Ã±×³¯ ½ºÅà °ø°£ÀÇ ¾çÀÌ´Ù. ½Ã±× ³¯ ½ºÅÃÀº Àû¾îµµ À̰ͺ¸´Ù´Â Ä¿¾ß¸¸ÇÑ´Ù.
´ëºÎºÐÀÇ °æ¿ì, SIGSTKSZ¸¦ »ç¿ëÇÑ´Ù. ÇÏÁö¸¸, ´ç½ÅÀÌ ´ç½ÅÀÇ ÇÁ·Î±×·¥ ½Ã±×³¯ Çڵ鷯°¡ ¾ó¸¶³ª ¸¹Àº ½ºÅà °ø°£À» ÇÊ¿ä·ÎÇÏ´ÂÁö ¾È´Ù¸é, ´ç½ÅÀº ´Ù¸¥ Å©±â¸¦ »ç¿ëÇϱ⸦ ¿øÇÒ °ÍÀÌ´Ù. ÀÌ °æ¿ì, ¿ì ¸®´Â ½Ã±×³¯ ½ºÅÃÀ» MINSIGSTKSZ·Î ÇÒ´çÇϰí, ss_size¸¦ Áõ°¡½ÃŲ´Ù.
int ss_flags
ÀÌ Çʵå´Â ´ÙÀ½ÀÇ Ç÷¡±×³ª ±×µéÀÇ Á¶ÇÕÀ» Æ÷ÇÔÇÑ´Ù.
SA_DISABLE
À̰ÍÀº ½Ã±×³¯ ½ºÅÃÀ» »ç¿ëÇÏÁö ¾ÊÀ»°ÍÀÓÀ» ½Ã½ºÅÛ¿¡°Ô ¾Ë¸°´Ù.
SA_ONSTACK
À̰ÍÀº ½Ã½ºÅÛ¿¡ ÀÇÇØ ¼³Á¤µÇ°í, ÇöÀç »ç¿ëÁßÀÎ ½Ã±×³¯ ½ºÅÃÀ» °¡¸®Å²´Ù. ¸¸ÀÏ ÀÌ ºñÆ®°¡ ¼³Á¤µÇÁö ¾ÊÀ¸¸é, ½Ã±×³¯Àº º¸Åë »ç¿ëÀÚ ½ºÅÃ»ó¿¡ ¹è´ÞµÉ °ÍÀÌ´Ù.
ÇÔ¼ö :
int sigaltstack (const struct sigaltstack *stack, struct sigaltstack *oldstack)
sigaltstack ÇÔ¼ö´Â ½Ã±×³¯ Çڵ鸵Áß¿¡ »ç¿ëÇÒ ´ëü ½ºÅÃÀ» Á¤ÇÑ´Ù. ½Ã±×³¯ÀÌ ÇÁ·Î¼¼½º¿¡ ÀÇÇØ ¹Þ¾Æ µé¿©Áö°í ±×°ÍÀÌ ½Ã±×³¯ ½ºÅÃÀ» »ç¿ëÇϵµ·Ï ÁöÁ¤ÇÒ ¶§, ½Ã½ºÅÛÀº ½Ã±×³¯ Çڵ鷯°¡ ½ÇÇàµÉµ¿¾È »ç¿ë µÇµµ·Ï ÇöÀç ÀνºÅçµÈ ½Ã±×³¯ ½ºÅÃÀ¸·Î º¯°æÇÑ´Ù. ¸¸ÀÏ oldstack ÀÌ ³Î Æ÷ÀÎÅͰ¡ ¾Æ´Ï¶ó¸é, ÇöÀç ÀÎ ½ºÅçµÈ ½Ã±×³¯ ½ºÅÿ¡ ´ëÇÑ Á¤º¸°¡ ±×°÷À¸·Î ¸®ÅϵȴÙ. ¸¸ÀÏ stack°¡ ³Î Æ÷ÀÎÅͰ¡ ¾Æ´Ï¶ó¸é, À̰ÍÀº ½Ã±×³¯ Çڵ鷯¿¡ÀÇÇØ »ç¿ëµÇµµ·Ï »õ·Î¿î ½ºÅÃÀ¸·Î ÀνºÅçµÈ´Ù. ¼º°øÇÏ¸é ¸®ÅϰªÀº 0ÀÌ°í ½ÇÆÐÇϸé -1ÀÌ´Ù. ¸¸ÀÏ sigaltstackÀÌ ½ÇÆÐÇϸé, ´ÙÀ½°ªµéÁß Çϳª·Î errno¸¦ ¼³Á¤ÇÑ´Ù.
EINVAL
´ç½ÅÀº ½ÇÁ¦·Î »ç¿ëÁßÀÌ¿´´ø ºÒ°¡´ÉÇÑ ½ºÅÃÀ¸·Î ½ÃµµÇÏ¿´´Ù.
ENOMEM
´ëü ½ºÅÃÀÇ Å©±â°¡ ³Ê¹« ÀÛ´Ù. ±×°ÍÀº Àû¾îµµ MINSIGSTKSZ º¸´Ù´Â Ä¿¾ß¸¸ ÇÑ´Ù.
´ÙÀ½Àº ¿À·¡µÈ sigstack ÀÎÅÍÆäÀ̽ºÀÌ´Ù. ´ç½ÅÀº sigaltstack ´ë½Å¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
µ¥ÀÌÅÍ Å¸ÀÔ : struct sigstack
ÀÌ ±¸Á¶Ã¼´Â ½Ã±×³¯ ½ºÅÃÀ» Ç¥ÇöÇÑ´Ù. ±×°ÍÀº ´ÙÀ½ÀÇ ¸â¹öµéÀ» Æ÷ÇÔÇÑ´Ù.
void *ss_sp
À̰ÍÀº ½ºÅà Æ÷ÀÎÅÍÀÌ´Ù. ¸¸ÀÏ ´ç½ÅÀÇ ±â°è¿¡¼ ½ºÅÃÀÌ ¹ØÂÊÀ¸·Î ¼ºÀåÇÑ´Ù¸é, À̰ÍÀº ´ç½ÅÀÌ ÇÒ´çÇÑ °÷ÀÇ À§¸¦ °¡¸®Å²´Ù. ¸¸ÀÏ ±× ½ºÅÃÀÌ À§¸¦ ÇâÇØ ¼ºÀåÇÑ´Ù¸é, ±×°ÍÀº ¹ØÀ» °¡¸®Å²´Ù.
int ss_onstack
ÀÌ Çʵå´Â ¸¸ÀÏ ÇÁ·Î¼¼½º¿¡¼ ÇöÀç ÀÌ ½ºÅÃÀ» »ç¿ëÇϰí ÀÖ´Ù¸é ÂüÀÌ´Ù.
ÇÔ¼ö :
int sigstack (const struct sigstack *stack, struct sigstack *oldstack)
sigstack ÇÔ¼ö´Â ½Ã±×³¯ Çڵ鸵 Áß¿¡ »ç¿ëÇÒ ´ëü ½ºÅÃÀ» Á¤ÇÑ´Ù. ½Ã±×³¯ÀÌ ÇÁ·Î¼¼½º¿¡ ÀÇÇØ ¹Þ¾Æµé ¿©Áö°í ±× µ¿ÀÛÀÌ ½Ã±×³¯ ½ºÅÃÀ» »ç¿ëÇϵµ·Ï Á¤ÇØÁø´Ù¸é, ½Ã½ºÅÛÀº ½Ã±×³¯ Çڵ鷯°¡ ½ÇÇàµÇ´Â µ¿¾È »ç¿ëÇÒ ÇöÀç ÀνºÅçµÈ ½Ã±×³¯ ½ºÅÃÀ¸·Î º¯°æÇÑ´Ù.
¸¸ÀÏ oldstack ÀÌ ³Î Æ÷ÀÎÅͰ¡ ¾Æ´Ï¶ó¸é, ÇöÀç ÀνºÅçµÈ ½Ã±×³¯ ½ºÅÿ¡ ´ëÇÑ Á¤º¸°¡ ±×°ÍÀÌ °¡¸®Å°´Â °÷À¸·Î ¸®ÅϵȴÙ. ¸¸ÀÏ stack°¡ ³Î Æ÷ÀÎÅͰ¡ ¾Æ´Ï¶ó¸é, À̰ÍÀº ½Ã±×³¯ Çڵ鷯¿¡ ÀÇÇØ »ç¿ëµÇµµ·Ï »õ ·Î¿î ½ºÅÃÀ¸·Î ÀνºÅçµÈ´Ù. ¼º°øÇϸé 0À» ¸®ÅÏÇÏ°í ½ÇÆÐÇϸé -1À» ¸®ÅÏÇÑ´Ù.