|
ÃÑ ÆäÀÌÁö ¼ö : 3121
![]()
|
ÇöÀçÀ§Ä¡ : ¹Ì´Ï»çÀÌÆ®>½Ã½ºÅÛÇÁ·Î±×·¡¹Ö>¸®´ª½º ½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö>ch06_Signal ![]() 1 signalÀÇ ÀϹÝÀû Á¤ÀÇ
Àǹ̸¦ Àü´ÞÇϱâ À§Çؼ »ç¿ëÇÏ´Â ÀϹÝÀûÀÎ ¹æ¹ýÀ¸·Î ½ÅÈ£¿Í ¸Þ½ÃÁö°¡ ÀÖ´Ù. ¸Þ½ÃÁö´Â ¾ð¾î±â¹ÝÀÇ Àü´Þ¹æ½ÄÀ̸ç, ¿©·¯Àǹ̸¦ ³»Æ÷Çϰí ÀÖ´Â ºñ±³Àû º¹ÀâÇÑ ÀǹÌÀü´Þ ¹æ½ÄÀÌ´Ù.
¹Ý¸é, ½ÅÈ£´Â ÇϳªÀÇ Àǹ̸¸À» ³»Æ÷ÇÑ´Ù. ÇØ¼®ÀÌ °£´ÜÇÏ°í ºü¸¥Àü´ÞÀÌ °¡´ÉÇÏ´Ù´Â ÀåÁ¡À» Áö³´Ù. ¿¹¸¦µé¾î ±³Åë½ÅÈ£ Ç¥ÁöÆÇÀº °¢°¢ÀÌ ÇϳªÀÇ Àǹ̸¸À» °¡Áö¸ç, ´©±¸¿¡°Ô³ª µ¿ÀÏÇÏ°Ô ÇØ¼®ÀÌ µÈ´Ù.
ÀÌ»óÀº ÀÏ¹Ý »ýȰ¿¡¼ÀÇ ½ÅÈ£¿Í ¸Þ½ÃÁöÀÇ Â÷ÀÌÁ¡À» ±â¼úÇѰǵ¥, ÄÄÇ»ÅÍ¿¡¼ÀÇ ÀǹÌÀü´Þ¿¡µµ ±×´ë·Î Àû¿ëµÈ´Ù. 1.1 ½Ã±×³Î
½Ã±×³Î Áï ½ÅÈ£´Â "ÀǹÌ"¸¦ »ó´ë¹æ¿¡°Ô Àü´ÞÇϱâ À§Çؼ »ç¿ëÇÏ´Â ¼ÒÅë¹æ½Ä Áß Çϳª·Î, ¾Æ¸¶µµ ÀηùÀÇ °¡Àå¿À·¡µÈ ¼ÒÅë¹æ½Ä Áß ÇϳªÀÏ °ÍÀÌ´Ù. Çϱä signalÀº Àΰ£¸¸ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Â À¯ÀÏÇÑ °ÍÀº ¾Æ´Ï´Ù. ½Ã±×³ÎÀº ±× ÀÚü°¡ º¹ÇÕÀûÀ̰í Ãß»óÀûÀÎ ¾ð¾îÀÇ ¼º°Ýº¸´Ù´Â ±¸Ã¼ÀûÀÌ°í ´Ü¼øÇÑ, Áï 1:1·Î Àǹ̰¡ ¸ÅĪÀÌ µÇ´Â ´Ü¼øÇÑ ¼ÒÅëÀÇ ¹æ½ÄÀ̱⠶§¹®ÀÌ´Ù. ¿¹ÄÁµ¥, µ¿¹°µéµµ ¿ïÀ½¼Ò¸®³ª ¸öµ¿ÀÛ, È£¸£¸ó, ¹è¼³¹°µéÀ» ÀÌ¿ëÇØ¼ ´Ù¸¥ µ¿¹°µé¿¡°Ô ½ÅÈ£¸¦ º¸³½´Ù.
signalÀÌ µ¿¹°µé°ú Àΰ£µé¿¡°Ô ÀÖ¾î¼ÀÇ ÃÖ¼ÒÇÑÀÇ ÀÇ»ç¼ÒÅëÀ¸·Î ¿À·§µ¿¾È ¼±È£µÇ¾î¿Â ÀÌÀ¯´Â ±× »ç¿ë¹æ¹ýÀÇ °£´ÜÇÔ°ú ÀǹÌÀü´ÞÀÇ È¿À²¿¡ ÀÖÀ» °ÍÀÌ´Ù. ¾ð¾îÀÇ °æ¿ì¿¡´Â ¸Å¿ì °£´ÜÇÑ ¹®ÀåÀ̶ó°í ÇÏ´õ¶óµµ ´Ù¾çÇÑ ÇØ¼®ÀÌ ÀÖÀ» ¼ö ÀÖ°í, ¹®È¿Í ȯ°æÀÌ ´Ù¸¦ °æ¿ì¿¡´Â ÀüÇô ´Ù¸¥ ÇØ¼®ÀÌ ÀÖÀ» ¼ö ÀÖÁö¸¸, Á¤º¸¿Í Àǹ̰¡ 1:1·Î ¸ÅĪµÇ´Â signalÀº ±× Àǹ̸¦ ÇØ¼®Çϴµ¥ ¸¹Àº ¿¡³ÊÁö¸¦ »ç¿ëÇÒ Çʿ䰡 ¾ø±â ¶§¹®ÀÌ´Ù. ºü¸£°í Àü´ÞµÇ°í ºü¸£°Ô ÇØ¼®µÈ´Ù´Â ÀåÁ¡À» °¡Áø´Ù°í º¼ ¼ö ÀÖ°Ú´Ù.
¹°·Ð signalµµ ´ÜÁ¡Àº ÀÖ´Ù. 1:1À̱⠶§¹®¿¡, »ýÁ¸¿¡ ÇÊ¿äÇÑ ÃÖ¼ÒÇÑÀÇ Á¤º¸¸¦ Á¤È®ÇÏ°Ô Àü´ÞÇϱ⿡´Â ¸Å¿ì È¿À²ÀûÀÌÁö¸¸, º¹ÀâÇÑ Àǹ̸¦ Àü´ÞÇÒ¶§¿¡´Â ¿ÀÈ÷·Á È¿À²ÀÌ ¶³¾îÁú ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù.
¿äÁò°ú °°ÀÌ º¹ÀâÇÑ ½Ã´ë¿¡, ½ÅÈ£¿Í °°Àº ´Ü¼øÇÑ °Íµé·Î´Â »ì¾Æ°¡±â°¡ ±ÍÂúÀ» °Í °°´Ù°í »ý°¢µÉÁöµµ ¸ð¸£Áö¸¸, »ç½Ç ½ÅÈ£´Â ¿ÀÈ÷·Á ´õ¿í´õ ³Î¸® »ç¿ëµÇ´Â Ãß¼¼´Ù. ±×·¸ÀݾƵµ º¹ÀâÇÑ ¼¼»óÀε¥, ¾î´À ¼¼¿ù¿¡ ±×°É ¸»°ú ±Û·Î ¼³¸íÇÏ°í ¾É¾Æ ÀÖÀ» °ÍÀΰ¡.
Áö±ÝÀº À§ÇèÇÏ¿À´Ï ±æÀ» °Ç³ÊÁö ¸¶½Ã¿ÀÇÏ´Â °Íº¸´Ù »¡°£ºÒÄÑÁÖ´Â°Ô Àǹ̸¦ ÈξÀ´õ Àß Àü´ÞÇÒ ¼ö ÀÖ´Ù. ½ÅÈ£´Â ¿ÀÈ÷·Á Â÷°í ³ÑÄ£´Ù. µµ·Î´Â ¿ÂÅë ½ÅÈ£µé·Î ³ÑÃijª¸ç, ÀÎÅÍ³Ý ¼¼°è¿ª½Ã À̸ðƼÄÜÀ¸·Î ´ëÇ¥µÇ´Â ½ÅÈ£µé·Î °¡µæ ä¿öÁ® ÀÖ´Ù.
ÀÌµé ½ÅÈ£´Â ÁÖ·Î ´ÙÀ½ÀÇ µÎ°¡Áö ¿ëµµ¿¡ ƯÈ÷ Àß »ç¿ëµÉ ¼ö ÀÖ´Ù.
1.2 ¸Þ½ÃÁö
½Ã±×³ÎÀº ºü¸£°í, °£´ÜÇÏ°Ô ÀÌÇØµÉ ¼ö ÀÖ´Ù´Â ÀåÁ¡ÀÌ ÀÖÁö¸¸ º¹ÀâÇÑ Á¤º¸¸¦ Àü´ÞÇÒ ¼ö ¾ø´Ù´Â ´ÜÁ¡À» °¡Áø´Ù. ±×·¡¼ Àΰ£ÀÇ ¾ð¾î¿Í ºñ½ÁÇÑ ÇüÅ·Π¸Þ½ÃÁö¸¦ ÀÌ¿ëÇØ¼ Á¤º¸¸¦ Àü´ÞÇÏ´Â ¹æ¹ýµµ ÀÖ´Ù.
ÀÌ ¹æ½ÄÀ» ÀÌ¿ëÇÏ¸é º¹ÀâÇÑ Á¤º¸¸¦ Àü´ÞÇÒ ¼ö ÀÖÁö¸¸, ¸Þ½ÃÁöÀÇ Çü½Ä°ú ÇØ¼®¹æ¹ý¿¡ ´ëÇØ¼ ¼·Î ¾à¼ÓÀÌ µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. ³ª´Â ³Ê¸¦ »ç¶ûÇÑ´Ù¶ó´Â Àΰ£ÀÇ ¸Þ½ÃÁö¸¦ ¿¹·Î µé¾îº¸ÀÚ. ÀÌ ¸Þ½ÃÁö¸¦ Á¤È®È÷ Àü´ÞÇϰí ÀÌÇØÇÒ·Á¸é ÁÖ¾î+µ¿»ç+¸ñÀû¾î¶ó´Â ¹®ÀåÀÇ Çü½Ä°ú ³ª, ³Ê, »ç¶û, ÇÏ´ÙÀÇ ´Ü¾îµéÀÇ Àǹ̸¦ ¾Ë°í ÀÖ¾î¾ß¸¸ ÇÑ´Ù. ¶ÇÇÑ ÀÌ·¯ÇÑ ¾à¼ÓÀ» ¾Ë°í ÀÖ´Ù°í ÇÏ´õ¶óµµ, ÀÚ½ÅÀÌ Ã³ÇÑ ¹®È/»çȸÀû ȯ°æ°ú ±³À°¼öÁØ¿¡ µû¶ó¼ ÀüÇô ´Ù¸£°Ô ÇØ¼®ÀÌ µÇ±âµµ ÇÑ´Ù.
ÀÌó·³ ÀÌ¿ëÇϱ⠺¹ÀâÇÏÁö¸¸ Çü½Ä°ú Àǹ̸¦ ÀÌÇØÇϰí ÀÖ´Ù¸é, ¸î°³ÀÇ ´Ü¾î¸¸À» °¡Áö°íµµ ¾öû³ª°Ô ´Ù¾çÇÑ Á¤º¸Àü´ÞÀÌ °¡´ÉÇÏ´Ù´Â ÀåÁ¡À» °¡Áø´Ù. ¿ì¸®°¡ ÀÏ»óÀûÀ¸·Î »ç¿ëÇÏ´Â ´Ü¾î´Â ¼öõ°³¿¡ ºÒ°úÇÏ´Ù. ±×·¸Áö¸¸ ÀÌ ¼öõ°³·Î °ÅÀÇ ¹«ÇÑ¿¡ °¡±î¿î Àǹ̸¦ Àü´ÞÇÒ ¼ö ÀÖ´Ù.
ÄÄÇ»ÅÍ¿¡¼´Â ÇÁ·Î¼¼½º°£ º¹ÀâÇÑ Á¤º¸±³È¯À» À§Çؼ ¸Þ½ÃÁö¸¦ ±³È¯ÇÏ´Â °æ¿ì°¡ ¸¹´Ù. Àΰ£ÀÇ ¾ð¾î¿Í ¸¶Âù°¡Áö·Î À̵鵵 ÇØ¼®µÉ ¼ö ÀÖµµ·Ï ¸Þ½ÃÁö ±Ô¾àÀ» °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ ¸Þ½ÃÁö ±Ô¾àÀ» ProtocolÀ̶ó°í ÇÑ´Ù. ¿¹¸¦µé¾î Web Server´Â Web Client¿Í ¸Þ½ÃÁö Åë½ÅÀ» Çϴµ¥, À̶§ µû¸£´Â ProtocolÀÌ HTTP(HyperText Transfer Protocol)ÀÌ´Ù. ¸¶Âù°¡Áö·Î ÆÄÀÏÀü¼ÛÀ» À§ÇÑ ÀϹÝÀûÀÎ ÇÁ·ÎÅäÄÝ·Î FTP°¡ ÀÖ´Ù.
IPC´Â µÞÀå¿¡¼ µû·Î ´Ù·ê °ÍÀÌ´Ù. ³×Æ®¿öÅ©»ó¿¡¼ socketÀ» ÀÌ¿ëÇÑ ÇÁ·Î¼¼½º°£ Åë½ÅÀº ÀÌ ¹®¼ÀÇ ¹üÀ§¸¦ ¹þ¾î³´Ù. ¾Æ¸¶µµ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö °ü·ÃµÈ º°µµÀÇ ¹®¼¸¦ ÅëÇØ¼ ´Ù·ç°Ô µÉ °ÍÀÌ´Ù. 2 ¿î¿µÃ¼Á¦¿¡¼ÀÇ signal
¿î¿µÃ¼Á¦°¡ ÇÏ´Â °¡Àå Áß¿äÇÑ ÀÏÀº ÄÄÇ»ÅÍ¿Í Àΰ£ÀÌ ¼·Î ¿øÇÒÈ÷ ¼ÒÅëÇÒ ¼ö ÀÖ°Ô²û µµ¿ÍÁÖ´Â ÀÏÀÌ µÉ°ÍÀÌ´Ù. ¿î¿µÃ¼Á¦¿Í Àΰ£ »çÀÌ¿¡´Â ´Ù½Ã ÀÀ¿ë ¼ÒÇÁÆ®¿þ¾î°¡ ³õ¿©ÀÖ°í, Àΰ£Àº ÀÀ¿ë ¼ÒÇÁÆ®¿þ¾î¸¦ ÅëÇØ¼ ¿î¿µÃ¼Á¦¿Í ¼ÒÅëÀ» ÇÏ°Ô µÈ´Ù. +----------+ | | | Computer |<--->| OS | <-------> ÀÀ¿ë APP <---------> »ç¿ëÀÚ | | | | <-------> ÀÀ¿ë APP | | | | <-------> ÀÀ¿ë APP +----------+ | |
¿î¿µÃ¼Á¦´Â À̵é ÀÀ¿ë ¼ÒÇÁÆ®¿þ¾î°£ ±×¸®°í ÀÀ¿ë ¼ÒÇÁÆ®¿þ¾î¿Í »ç¿ëÀÚ°£ÀÇ ¼ÒÅëÀ» À§ÇÑ ¸î°¡Áö µµ±¸µéÀ» Á¦°øÇÑ´Ù. ¿¹ÄÁµ¥, IPC(´ÙÀ½ Àå¿¡¼ ´Ù·ç°ÔµÉ)¿Í °°Àº °ÍµéÀε¥, À̰ÍÀº Àΰ£ÀÇ ¾ð¾îÀÇ ÇüÅ¿¡ °¡±õ´Ù. Áï ´Ù¾çÇÑ ÇüÅÂ·Î ÇØ¼®µÉ ¼ö ÀÖ´Â ¸Þ½ÃÁöµéÀ» ÁÖ°í ¹ÞÀ½À¸·Î½á, °¢°¢ÀÇ °´Ã¼µé°£ÀÇ ¼ÒÅëÀ» Áö¿øÇÑ´Ù.
À̵éÀº ÀçÇØ¼®°¡´ÉÇÑ µ¥ÀÌÅ͸¦ ÀÌ¿ëÇϱ⠶§¹®¿¡, °´Ã¼°£ º¹ÀâÇÑ ¼ÒÅëÀ» ÇÒ ¼ö ÀÖÁö¸¸, ¹Ý´ë·Î »ç¿ëÇϱ⿡ ³Ê¹« º¹ÀâÇÑ ¸éÀÌ ÀÖ´Ù. ¶§·Î´Â Àΰ£À̳ª ȤÀº µ¿¹°µéÀÌ ±×·¸µíÀÌ, ¾ÆÁÖ °£´ÜÇÏ°Ô ¼ÒÅëÇÒ ¼ö ÀÖ´Â signal°°Àº µµ±¸µµ ÇÊ¿äÇÒ °ÍÀÌ´Ù.
±×·¡¼ ´ëºÎºÐÀÇ ¿î¿µÃ¼Á¦´Â signalÀ» Áö¿øÇϸç, ¸¶Âù°¡Áö·Î Linuxµµ signalÀ» Áö¿øÇÑ´Ù. ½Ã±×³ÎÀº Àΰ£À̳ª µ¿¹°ÀÌ »ç¿ëÇÏ´Â ±×°Í°ú ¸Å¿ì À¯»çÇÏ´Ù. Áï ÀÇ¹Ì¿Í Á¤º¸°¡ 1:1·Î ¸ÅĪµÇ±â ¶§¹®¿¡, ÀçÇØ¼®ÇÒ ÇÊ¿ä¾øÀÌ Áï½Ã Àǹ̸¦ ¾Ë¾Æ³¾ ¼ö ÀÖµµ·Ï µÇ¾î ÀÖ´Ù.
¸®´ª½º ¿î¿µÃ¼Á¦´Â ¹Ì¸® ¾à¼ÓµÇ¾î ÀÖ´Â ¼ö½Ê°¡ÁöÀÇ signalÀ» Á¦°øÇϴµ¥, kill(1)À» ÀÌ¿ëÇÏ¸é ¸®´ª½º°¡ Áö¿øÇÏ´Â signalÀÇ Á¾·ù¸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. # kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX¿©±â¿¡¼ ½Ã±×³ÎÀÇ À̸§°ú ±× ½Ã±×³ÎÀÇ °íÀ¯¹øÈ£¸¦ ¾Ë ¼ö ÀÖ´Ù.
»ó´çÈ÷ ¸¹Àº ½Ã±×³ÎÀÌ Àִµ¥, ÀÚÁÖ»ç¿ëµÇ´Â °ÍµéÀ» Á¤¸®ÇØ º¸ÀÚ¸é ´ÙÀ½°ú °°´Ù. °¢°¢ÀÇ ½Ã±×³ÎÀº °íÀ¯ÇÑ ´ÜÀÏÀÇ Àǹ̸¦ °¡Áö°í ÀÖÀ½À» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÌµé ½Ã±×³ÎÀº ÀÏ»ó»ýȰ¿¡¼ »ç¿ëÇÏ´Â ½Ã±×³Î°ú ¸¶Âù°¡Áö·Î ºñµ¿±âÀûÀÎ »ç°ÇÀÇ ¹ß»ýÀ» ÅëÁöÇϱâ À§ÇÑ ¿ëµµ¿Í »ç°ÇÀ» µ¿±âÈ ½Ã۱â À§Çѿ뵵·Î Å©°Ô ³ª´ ¼ö ÀÖ´Ù. À§ÀÇ °æ¿ì¸¦ ¿¹·Î µé¾î¼ ¼³¸íÇØ º¸ÀÚ¸é, SIGALARMÀº »ç°ÇÀ» µ¿±âÈ ½Ã۱â À§Çؼ, SIGKILL, SIGSEGV´Â ºñµ¿±âÀûÀÎ »ç°ÇÀ» ÅëÁöÇϱâ À§Çؼ »ç¿ëÀ» ÇÑ´Ù. 3 shell¿¡¼ signalÀÇ »ç¿ë
shell ÇÁ·Î±×·¥À» ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ signalÀ» Àü´ÞÇÒ ¼ö ÀÖ´Â kill(1)À̶ó´Â ÇÁ·Î±×·¥À» Á¦°øÇÑ´Ù. »ç¿ë¹æ¹ýÀº ´ÙÀ½°ú °°´Ù. kill -signal pid¿¹¸¦µé¾î pid°¡ 100ÀÎ ÇÁ·Î¼¼½º¸¦ Á×ÀÌ°í ½Í´Ù¸é, ¾Æ·¡¿Í °°ÀÌ killÀ» »ç¿ëÇÏ¸é µÈ´Ù. # kill -SIGKILL 100ȤÀº ½Ã±×³Î À̸§´ë½Å¿¡ ½Ã±×³ÎÀÇ °íÀ¯¹øÈ£¸¦ »ç¿ëÇÏ´Â ¹æ¹ýµµ ÀÖ´Ù. #kill -9 100ÀÌÁ¦ 100¹ø ÇÁ·Î¼¼½º·Î SIGKILL ½Ã±×³ÎÀÌ Àü´ÞµÇ°í, ÇØ´ç ÇÁ·Î¼¼½º´Â °Á¦·Î Á¾·á°¡ µÉ °ÍÀÌ´Ù. ¹°·Ð, ±×·¸´Ù°í ÇØ¼ ¾Æ¹« ÇÁ·Î¼¼½º³ª ¸¶±¸ ½Ã±×³ÎÀ» º¸³¾ ¼ö ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù. ÀڱⰡ ±ÇÇÑÀ» °¡Áö°í ÀÖ´Â ÇÁ·Î¼¼½º¿¡ ´ëÇØ¼¸¸ ½Ã±×³ÎÀ» º¸³¾ ¼ö ÀÖ´Ù. ¾Æ¹« ÇÁ·Î¼¼½º¿¡ °ü°è¾øÀÌ ½Ã±×³ÎÀ» º¸³»±â À§Çؼ´Â root ±ÇÇÑÀ» °¡Á®¾ß¸¸ ÇÑ´Ù.
¶ÇÇÑ Å°º¸µå ÀÔ·ÂÀ¸·Î ½Ã±×³ÎÀ» ¹ß»ý½Ãų ¼öµµ ÀÖ´Ù. °¡Àå ´ëÇ¥ÀûÀΰÔ, ÇÁ·Î±×·¥À» Á¾·á½Ã۱â À§Çؼ Ctrl+C ÀÔ·ÂÇÏ´Â °ÍÀ¸·Î, ÀÌ Å°¸¦ ÀÔ·ÂÇϸé ÇØ´ç ÇÁ·Î¼¼½º¿¡ SIGINT°¡ Àü´ÞÀÌ µÇ¾î¼ ÇÁ·Î¼¼½º°¡ Á¾·á°¡ µÈ´Ù. ¾Õ¿¡¼ SIGINT´Â ÇÁ·Î¼¼½ºÀÇ Áß´ÜÀ̶ó°í Çߴµ¥, ¿Ö Á¾·á°¡ µÇ´Â°ÇÁö°¡ Àǹ®Á¡À¸·Î ³²À» °ÍÀÌ´Ù. ÀÌ¿¡ ´ëÇØ¼´Â ´ÙÀ½Àý¿¡¼ ¼³¸íÇϵµ·Ï ÇÒ °ÍÀÌ´Ù. Ctrl+C¸¦ ÀÔ·ÂÇßÀ» ¶§, ÇÁ·Î±×·¥ÀÌ Á¾·áµÇ´Â°Ç ¾î·ÆÁö ¾Ê°Ô È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¾Æ·¡ÀÇ ÇÁ·Î±×·¥À¸·Î È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ. ÇÁ·Î±×·¥À̸§Àº sigtest.c ·Î ÇϰڴÙ. #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { int i = 0; while(1) { printf("%d\n", i); i++; } }
Űº¸µå ÀÔ·ÂÀ¸·Î ¹ß»ý½Ãų ¼ö ÀÖ´Â ½Ã±×³ÎÀº Ctrl+C ¿Ü¿¡µµ ¾Æ·¡ÀÇ ¸î°¡Áö°¡ ÀÖ´Ù.
4 ½Ã±×³ÎÀ» ¹Þ¾ÒÀ» ¶§
½Ã±×³ÎÀº °íÀ¯ÀÇ Àǹ̸¦ ³»Æ÷Çϰí ÀÖ´Ù. ÀÌ·¯ÇÑ ½Ã±×³ÎÀ» ¹ÞÀº ½ÇÇఴüÀÎ ÇÁ·Î¼¼½º´Â ±×¿¡ ¸Â´Â ÇൿÀ» ÇØ¾ß ÇÑ´Ù. ½Ã±×³ÎÀ» ¹ÞÀº ÇÁ·Î¼¼½º´Â ´ÙÀ½Áß ÇѰ¡Áö ÇൿÀ» ÃëÇØ¾ß ÇÑ´Ù.
¸¸¾à ½Ã±×³ÎÀ» ¹«½ÃÇÏÁöµµ ¾Ê°í, È£ÃâÇÒ ÇÔ¼öµµ µî·ÏÇÏÁö ¾Ê¾Ò´Ù¸é ½Ã±×³Î¿¡ ´ëÇÑ ±âº»ÇൿÀ» ÃëÇÏ°Ô µÈ´Ù. ÀÌ ±âº»Çൿ¿¡´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ ÀÖ´Ù.
½Ã±×³Î¿¡ ´ëÇØ¼, È£ÃâµÉ ÇÔ¼ö¸¦ µî·ÏÇϰdzª ȤÀº ¹«½ÃÇÏ°Ô ¸¸µå´Â °ÍÀº µÚ¿¡ µû·Î ´Ù·çµµ·Ï ÇϰڴÙ. 5 ½Ã±×³ÎÀÇ ¹üÁÖ
½Ã±×³ÎÀº Á¦¾î°¡´ÉÇÑ ½Ã±×³Î°ú ±×·¸Áö ¸øÇÑ ½Ã±×³ÎÀÌ ÀÖ´Ù. ¿©±â¿¡¼ Á¦¾î´Â ½Ã±×³ÎÀ» catchÇÏ´Â °Í¿¡¼ ºÎÅÍ ½ÃÀ۵ȴÙ. catchÇÏÁö ¸øÇÑ´Ù¸é (´ç¿¬È÷)Á¦¾îÇÒ ¼öµµ ¾ø´Ù.
´ëºÎºÐÀÇ ½Ã±×³ÎÀº catch°¡ °¡´ÉÇϸç, ¹«½ÃÇϰųª, ±âº»ÇൿÀ» ÇÏ°Ô Çϰųª, º°µµÀÇ ÇÔ¼ö¸¦ ½ÇÇà½Ãų ¼ö ÀÖ´Ù. ±×·¯³ª catch ºÒ°¡´ÉÇÑ ÇÔ¼ö°¡ Àִµ¥, SIGKILL°ú °°Àº ÇÔ¼ö°¡ ´ëÇ¥ÀûÀÌ´Ù.
SIGKILLÀº ÇÁ·Î¼¼½º¸¦ ¹«Á¶°Ç Á×À̱â À§Çؼ »ç¿ëÇϴµ¥, ¿¹ÄÁµ¥ ¿Àµ¿ÀÛÇÏ¸é¼ CPUÀÚ¿øÀ» ¹«ÇÑ´ë·Î ¼ÒºñÇÏ´Â ÇÁ·Î¼¼½º¶ó¸é °Á¦·Î Á¾·á½ÃÄÑ¾ß ÇÒ °ÍÀÌ´Ù. ±×·±µ¥, ½Ã±×³ÎÀÌ catch µÇ¾î¼ ½Ã±×³ÎÀ» ¹«½ÃÇÏ°Ô ÇØ¹ö¸°´Ù¸é, ½Ã½ºÅÛ °ü¸®Àڷμ´Â »ó´çÈ÷ ³°¨ÇÒ °ÍÀÌ´Ù. ±×·¯¹Ç·Î ÀÌ ÇÁ·Î¼¼½º´Â catchÇÏÁö ¸øÇϵµ·Ï Çϰí ÀÖ´Ù.
SIGSTOPµµ ¸¶Âù°¡Áö·Î catchÇÒ ¼ö ¾ø´Ù. SIGSTOP¸¦ ¹ÞÀº ÇÁ·Î¼¼½º´Â Áï½Ã ÁߴܵǾî¾ß Çϸç, ¹«½ÃÇÒ ¼ö ¾ø´Ù. ¿ª½Ã ½Ã½ºÅÛ °ü¸®¸¦ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. 6 ½Ã±×³Î ÇÁ·Î±×·¡¹Ö
½Ã±×³ÎÀÌ Àü´ÞµÇ¸é, ÇÁ·Î¼¼½º´Â ¹«½ÃÇÏ´øÁö, ÁöÁ¤µÈ ÇÔ¼ö¸¦ È£ÃâÇϵçÁö ÇØ¾ß ÇÑ´Ù. ±×·¸Áö ¾Ê´Ù¸é ±âº»ÇൿÀ» ÃëÇÏ°Ô µÈ´Ù. ¿©±â¿¡¼´Â ½Ã±×³ÎÀ» Á¦¾îÇÏ´Â ¹æ¹ý Áï, ½Ã±×³ÎÀ» ¹«½ÃÇϰųª È£ÃâµÈ ÇÔ¼ö¸¦ ÁöÁ¤ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇÒ °ÍÀÌ´Ù. 6.1 kill ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ ½Ã±×³Î º¸³»±â
killÀº ÇÁ·Î¼¼½º¿¡ ½Ã±×³ÎÀ» Àü´ÞÇϱâ À§Çؼ »ç¿ëÇÒ ¼ö ÀÖ´Â °¡Àå°£´ÜÇÑ ÇÔ¼ö·Î, ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù. #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig);
#include <sys/types.h> #include <signal.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char **argv) { int pid; int sig_num; if (argc != 3) { printf("usage %s [pid] [signum]\n", argv[0]); return 1; } // ½ÇÇàÀÎÀÚ·Î pid ¹øÈ£¿Í // Àü¼ÛÇÒ signal ¹øÈ£¸¦ ¹Þ¾Æµé¿©¼ // À̸¦ ÇØ´ç pid ·Î º¸³½´Ù. pid = atoi(argv[1]); sig_num = atoi(argv[2]); if(!kill(pid, sig_num)) { perror("Signal Send error"); return 1; } return 0; }´ÙÀ½Àº ½ÇÇà °á°ú´Ù. $ ./signal 6653 2 Signal Send error: Success 6.2 signal ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ ½Ã±×³Î catch
killÀº ´Ù¸¥ ÇÁ·Î¼¼½º¿¡°Ô ½Ã±×³ÎÀ» º¸³»±â¸¸ ÇÒ»Ó, Àڽſ¡°Ô Àü´ÞµÇ´Â ½Ã±×³ÎÀ» catch ÇØ¼ ó¸®ÇÒ ¼ö´Â ¾ø´Ù. ¸®´ª½º´Â signal ÇÔ¼ö¸¦ Á¦°øÇÏ´Â µ¥, À̸¦ ÀÌ¿ëÇØ¼ Àڽſ¡°Ô Àü´ÞµÇ´Â ½Ã±×³ÎÀ» ó¸®ÇÒ ¼ö ÀÖ´Ù.
signal ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù. #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);
001 #include <signal.h> 002 #include <unistd.h> 003 #include <stdio.h> 004 005 void sig_handler(int signo); 006 007 int main(int argc, char **argv) 008 { 009 int i = 0; 010 signal(SIGINT, (void *)sig_handler); 011 while(1) 012 { 013 printf("%d\n", i); 014 sleep(2); 015 i++; 016 } 017 } 018 019 void sig_handler(int signo) 020 { 021 printf("I Received SIGINT(%d)\n", SIGINT); 022 } 023CTRL+C ¸¦ ÀÔ·ÂÇÏ°Ô µÇ¸é, ÇöÀç ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½º¿¡ SIGINT°¡ Àü´ÞÀÌ µÈ´Ù. SIGINT¿¡ ´ëÇÑ ÇÁ·Î¼¼½ºÀÇ ±âº»ÇൿÀº Á¾·áÀ̱⠶§¹®¿¡, Ưº°È÷ ½Ã±×³ÎÀ» Á¦¾îÇÏÁö ¾ÊÀ» °æ¿ì ÇÁ·Î±×·¥Àº Á¾·á°¡ µÈ´Ù. ±×·¯³ª À§¿¡¼´Â signalÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ SIGINT¿¡ ´ëÇØ¼ sig_handler¶ó´Â ÇÔ¼ö¸¦ ½ÇÇàÇϵµ·Ï Çß´Ù. ÀÌÁ¦ CTRL+C¸¦ ÀÔ·ÂÇÏ°Ô µÇ¸é, ÇÁ·Î¼¼½º°¡ Á¾·áµÇ´Â ´ë½Å sig_handler¸¦ ½ÇÇàÇÏ´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
À§ ¿¹¿¡¼´Â ½Ã±×³ÎÇÔ¼ö¸¦ ½ÇÇà½Ã۵µ·Ï Çϰí Àִµ¥, ½Ã±×³ÎÀ» ¹«½ÃÇϰųª ½Ã±×³ÎÀÇ ±âº»ÇൿÀ¸·Î µÇµ¹¾Æ°¡µµ·Ï ÇÒ ¼öµµ ÀÖ´Ù. À̰æ¿ì sig_handler ´ë½Å¿¡ SIG_IGN°ú SIG_DFLÀ» ÀÌ¿ëÇÏ¸é µÈ´Ù.
signal(SIGINT, SIG_IGN);CTRL+C ۰¡ ¾Æ¿¹¸ÔÁö ¾Ê´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
±×·¸´Ù¸é SIG_DFLÀº ¾ðÁ¦ »ç¿ëµÇ´Â°¡ ? º°µµÀÇ ½Ã±×³ÎÁ¦¾î ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é, ½Ã±×³Î¿¡ ´ëÇØ¼ ±âº»ÇൿÀ» Çϵµ·Ï µÇ¾î Àִµ¥, »ç¿ëÇÒ Çʿ䰡 Àִ°¡ ÇÏ´Â Àǹ®ÀÌ »ý±æ ¼ö ÀÖÀ» °ÍÀÌ´Ù. SIG_DFLÀº ´ÙÀ½ÀÇ µÎ°¡Áö ¿ëµµ·Î ÁÖ·Î »ç¿ëµÈ´Ù.
7 ½Ã±×³ÎÀÇ Æ¯Â¡
Áö±Ý±îÁö ÇØ¼, ½Ã±×³ÎÀÇ °£´ÜÇÑ Æ¯Â¡°ú ½Ã±×³ÎÀ» Àü¼ÛÇÏ°í ¹Þ´Â °Í¿¡ ´ëÇÑ ±âº»ÀûÀÎ Á¤º¸¸¦ ¾ò°Ô µÇ¾ú´Ù. ÀÌÁ¦ º»°ÝÀûÀ¸·Î ½Ã±×³ÎÀÇ Á¦¾î¿Í °ü·ÃµÈ ¾ê±â¸¦ ÇØ¾ß ÇҰǵ¥, ±× Àü¿¡ ½Ã±×³ÎÀÇ ¼¼ºÎÀûÀΠƯ¡¿¡ ´ëÇØ¼ ¾ð±ÞÇÏ°í ³Ñ¾î°¡¾ß ÇÒ°Í °°´Ù.
´ë»óÀÌ ¹«¾ùÀ̵çÁö °£¿¡, ´ë»óÀ» Á¦´ë·Î Á¦¾îÇϱâ À§Çؼ´Â ´ë»óÀÇ Æ¯Â¡À» ¿ì¼±¾Ë°í ÀÖ¾î¾ß ÇÒ °ÍÀ̱⠶§¹®ÀÌ´Ù. 7.1 ´ë±â¿À» °¡ÁöÁö ¾Ê´Â´Ù.
½Ã±×³ÎÀÇ Ã¹¹øÂ° Ư¡Àº ´ë±â¿À» °¡ÁöÁö ¾Ê´Â ´Ù´Â Á¡ÀÌ´Ù. À̰ÍÀº ¹¹³Ä¸é, ÇÁ·Î¼¼½º´Â µ¿½Ã¿¡ ÇϳªÀÇ ½Ã±×³Î¸¸ ó¸®ÇÒ ¼ö ÀÖ´Ù´Â ¾ê±â°¡ µÈ´Ù. ¿¹¸¦µé¾î¼ SIGINT ½Ã±×³ÎÀ» ¹Þ¾Æ¼, ÀÌ¿¡ ´ëÇÑ Ã³¸®¸¦ Çϰí ÀÖ´ÂÁß¿¡, ´Ù½Ã SIGINT°¡ ¹ß»ýÇÏ°Ô µÈ´Ù¸é, ÀÌ ½Ã±×³ÎÀº ÀÒ¾î¹ö¸®°Ô µÈ´Ù.
´ÙÀ½Àº ´ë±â¿À» °¡ÁöÁö ¾Ê´Â ½Ã±×³ÎÀÇ Æ¯Â¡À» Å×½ºÆ®Çϱâ À§ÇÑ °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù.
À§ÀÇ sigint.c¿¡ ÇÑÁÙÃß°¡ÇßÀ» »ÓÀÌ´Ù. 001 #include <signal.h> 002 #include <unistd.h> 003 #include <stdio.h> 004 005 void sig_handler(int signo); 006 007 int main(int argc, char **argv) 008 { 009 int i = 0; 010 signal(SIGINT, (void *)sig_handler); 011 while(1) 012 { 013 printf("%d\n", i); 014 sleep(2); 015 i++; 016 } 017 } 018 019 void sig_handler(int signo) 020 { 021 printf("I Received SIGINT(%d)\n", SIGINT); 022 sleep(4); 023 } 02423¶óÀο¡ sleep()ÇÔ¼ö°¡ Ãß°¡µÇ¾ú´Ù. ÀÌÁ¦ ÇÁ·Î±×·¥À» ½ÇÇà½Ã۰í, CTRL+C¸¦ ÀÔ·ÂÇϸé SIGINT°¡ Àü´ÞµÉ °ÍÀ̰í, ÇÁ·Î¼¼½º´Â sig_handlerÀ» ½ÇÇà½Ãų °ÍÀÌ´Ù. sig_handler´Â 4Ãʸ¦ ±â´Ù¸®´Âµ¥, À̶§ CTRL+C¸¦ ´Ù´Ù´Ú ´·¯¼ ÇÑ 10¹ø Á¤µµ ½ÇÇà½ÃÄѺ¸ÀÚ.
¸¸¾à ½Ã±×³Î´ë±â¿ÀÌ ÀÖ´Ù¸é, sig_hanler´Â 4ÃÊÀÇ °£°ÝÀ» µÎ°í 10¹ø ½ÇÇàµÇ¾î¾ß ÇϰÚÁö¸¸, ´Ü Çѹø¸¸ ½ÇÇàµÇ´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿Ö³ÄÇÏ¸é ´ë±â¿ÀÌ ¾ø±â ¶§¹®¿¡, sig_handlerÀÌ ½ÇÇàµÈ ÈÄ, ¿ÀÁ÷ ÇϳªÀÇ SIGINT¸¸ Á¢¼ö°¡ µÇ±â ¶§¹®ÀÌ´Ù.
³ª¸ÓÁö ½Ã±×³ÎÀº ÀüºÎ ¹ö·ÁÁø´Ù.
Àǹ̸¦ Àü´ÞÇϱâ À§ÇÑ ¸Å¿ì »ç¿ëÇÏ±â ÆíÇÑ ¹æ¹ýÀÓ¿¡µµ ºÒ±¸Çϰí, ½Ã±×³ÎÀÇ ÀÌ·¯ÇÑ Æ¯Â¡Àº ½Ã±×³ÎÀÇ »ç¿ëÀ» ÁÖÀúÇÏ°Ô ¸¸µå´Â ÀÌÀ¯°¡ µÇ±âµµ ÇÑ´Ù. ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ, ÃÖ±Ù¿¡´Â ½Ã±×³ÎÀÌ ´ë±âÇÒ ¼ö ÀÖ´Â ´ë±â¿ ¸ÅÄ¿´ÏÁòÀ» Á¦°øÇÏ´Â RTS(real-time signal)ÀÌ »ç¿ëµÇ±âµµ ÇÑ´Ù. RTS¿¡ ´ëÇÑ ³»¿ëÀº ÀÌ ¹®¼ÀÇ ÈĹݺο¡¼ µû·Î ´Ù·çµµ·Ï ÇϰڴÙ. 7.2 ºñ½Å·Ú¼º
¿äû¿¡ ´ëÇÑ ÀÀ´äÀ¸·Î ¸Þ½ÃÁö°¡ Àü´ÞµÇ¾ú´ÂÁö È®ÀÎÇÏ´Â ½Ö¹æÇâ Åë½Å°ú´Â ´Þ¸®, ½Ã±×³ÎÀº ÇÁ·Î¼¼½º¿¡ Á¦´ë·Î Àü´ÞµÇ¾ú´ÂÁö È®ÀÎÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ¾ø´Ù.
½ÅÈ£°¡ Àü´ÞµÇ¾ú´ÂÁö¸¦ ½Å·ÚÇÒ ¼ö ¾ø±â ¶§¹®¿¡ ºñ½Å·ÚÀûÀΠƯ¡À» °¡Áø´Ù°í ¸»ÇÑ´Ù. 8 signalÀÇ Á¦¾î
ÀÌÁ¦ ½Ã±×³ÎÀ» Á¦¾îÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼ ÀÚ¼¼È÷ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ½Ã±×³ÎÀÇ Á¦¾î´Â Å©°Ô 3°¡Áö ºÎºÐÀ¸·Î ÀÌ·ç¾îÁø´Ù.
8.1 killÀ» ÀÌ¿ëÇÑ ½Ã±×³ÎÀÇ Àü¼Û
signalÀ» Àü¼ÛÇϱâ À§ÇÑ °¡Àå °£´ÜÇÑ ¹æ¹ýÀº kill(2) ½Ã½ºÅÛÇÔ¼ö¸¦ ÀÌ¿ëÇÏ´Â °ÍÀ¸·Î, killÀÇ »ç¿ë¹æ¹ýÀº ´ÙÀ½°ú °°´Ù. - shellÀÇ kill ¸í·É°ú È¥µ¿ÇÏÁö ¸»ÀÚ. - #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig);pid´Â ½Ã±×³ÎÀ» ¹ÞÀ» ÇÁ·Î¼¼½ºÀÇ pid·Î ±×·ì ȤÀº ƯÁ¤ pid¿¡ ½Ã±×³ÎÀ» º¸³¾ ¼ö ÀÖ´Ù.
8.2 signal¸¦ ÀÌ¿ëÇÑ ºñµ¿±âÀû ½Ã±×³Î ó¸®
±×·³ ºñµ¿±âÀûÀ¸·Î ¹ß»ýÇÏ´Â ½Ã±×³ÎÀ» ó¸®ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ºñµ¿±âÀûÀ̶ó´Â °ÍÀº ƯÁ¤ ½ÃÁ¡¿¡¼ ½Ã±×³ÎÀÌ ¹ß»ýÇÏ´Â °ÍÀ» ±â´Ù¸®Áö ¾Ê´Â´Ù´Â ¾ê±â°¡ µÈ´Ù. Áï ½Ã°£À» ÀÏÄ¡ ½ÃŰÁö ¾Ê°Ú´Ù´Â °ÍÀ¸·Î ÀüȺ§ÀÌ ½ÅÈ£¶ó°í ÇÒ¶§, ÀüȺ§ÀÌ ¾ðÁ¦ ¿òÁ÷ÀÏ Áö¸¦ ¾Ë ¼ö ¾ø´Ù. ¿ì¸®´Â ÀüȺ§À» ±â´Ù¸®Áö ¾Ê´Â´Ù. ÀüȺ§ÀÌ ¿òÁ÷ÀÌ¸é ¹ÝÀÀÇÒ »ÓÀÌ´Ù. - ¹°·Ð ±â´Ù¸®´Â Àüȵµ ÀÖ±ä ÇÏÁö¸¸ -
¸®´ª½º´Â signal(2) À̶ó´Â ÇÔ¼ö¸¦ Á¦°øÇϴµ¥, ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ ºñµ¿±âÀûÀ¸·Î ¹ß»ýÇÏ´Â ½Ã±×³Î¿¡ ¹ÝÀÀÇØ¼ ÇÊ¿äÇÑ ÀÏÀ» ¼öÇà ÇÒ¼ö ÀÖ´Ù. ´ÙÀ½Àº signal ÇÔ¼öÀÇ »ç¿ë¹ýÀÌ´Ù. #include <signal.h> void (*signal(int signum, void (*handler) (int))) (int);
#include <signal.h> #include <stdio.h> void mystop(int signo) { printf("I Received Signal : %d\n", signo); } int main(int argc, char **argv) { int i =0; signal(SIGQUIT, (void *)mystop); while(1) { printf("%d\n", i); i++; sleep(1); } return 1; } 8.3 signalÀ» ÀÌ¿ëÇÑ µ¿±âÀû ½Ã±×³Î ó¸®
µ¿±âÀû ½Ã±×³Î 󸮶ó´Â °ÍÀº ¿ì¸®°¡ ´Ù¸¥ ÀÏÀ» Á¦ÃÄµÎ°í ¾ÖÀÎÀÇ ÀüȺ§À» ±â´Ù¸®´Â °Íó·³, ÀÛ¾÷À» Áß´ÜÇÏ°í ½Ã±×³ÎÀ» ±â´Ù¸®°Ú´Ù¶ó´Â ¾ê±â°¡ µÈ´Ù.
¸®´ª½º´Â sigwait()ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. #include <signal.h> int sigwait(const sigset_t *set, int *sig);sigwait ´Â set¿¡ µî·ÏµÈ ½Ã±×³ÎÀÌ ¹ß»ýµÉ ¶§±îÁö ±â´Ù¸°´Ù. ¿©±â¿¡ sigset_t¶ó´Â µ¥ÀÌÅÍŸÀÔÀÌ µîÀåÇϴµ¥, ¿©±â¿¡´Â ½Ã±×³Î¿¡ ´ëÀÀµÇ´Â bit °ªÀÌ ¼³Á¤µÇ¾î ÀÖ´Ù.
sigwait¸¦ ´Ù·ç±â À§Çؼ´Â ½Ã±×³ÎÀ» °´Ã¼·Î ´Ù·ç´Â ¹æ¹ý¿¡ ´ëÇÑ Áö½ÄÀÌ ÇÊ¿äÇÏ´Ù. sigaction ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¸é ½Ã±×³ÎÀ» °´Ã¼´ÜÀ§·Î ´Ù·ê ¼ö Àִµ¥, (´ÙÀ½ Àý¿¡¼) sigactionÀ» ´Ù·ç¸é¼ sigwaitÀÇ »ç¿ë¹æ¹ý¿¡ ´ëÇØ¼ ¼³¸íÇϵµ·Ï ÇϰڴÙ. 9 sigaction ÇÔ¼ö±º À» ÀÌ¿ëÇÑ ½Ã±×³Î °´Ã¼ÀÇ Ã³¸®
signal ÇÔ¼ö´Â °£´ÜÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ±â´Â ÇÏÁö¸¸ ½Ã±×³ÎÀ» °´Ã¼·Î º¸Áö ¾Ê°í, ´ÜÀÏ ´ë»óÀ¸·Î º»´Ù´Â ¹®Á¦Á¡À» °¡Áø´Ù. sigactionÀ» »ç¿ëÇÏ¸é ½Ã±×³ÎÀ» °´Ã¼·Î ´Ù·ê ¼ö Àִµ¥, ÀÌ °´Ã¼¿¡´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ Æ÷ÇԵȴÙ.
#include <signal.h>
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); int sigpending(sigset_t *set); int sigismember(sigset_t *set, int signum); int sigsuspend(const sigset_t *mask); int sigfillset(sigset_t *set); int sigaddset(sigset_t *set, int signum); int sigemptyset(sigset_t *set); int sigdelset(sigset_t *set, int signo);
001 #include <signal.h> 002 #include <unistd.h> 003 #include <string.h> 004 #include <stdio.h> 005 006 void sig_int(int signo); 007 void sig_usr(int signo); 008 009 int main() 010 { 011 int i = 0; 012 struct sigaction intsig, usrsig; 013 014 printf("PID : %d\n", getpid()); 015 // SIGUSR2 ½Ã±×³ÎÀÇ Ã³¸® ---------- 016 usrsig.sa_handler = sig_usr; // ½Ã±×³Î Çڵ鷯 µî·Ï 017 sigemptyset(&usrsig.sa_mask); // ½Ã±×³Î ¸¶½ºÅ© ÃʱâÈ 018 usrsig.sa_flags = 0; 019 if (sigaction(SIGUSR2, &usrsig, 0) == -1) 020 { 021 printf ("signal(SIGUSR2) error"); 022 return -1; 023 } 024 // --------------------------------- 025 026 // SIGINT (CTRL+C) ½Ã±×³ÎÀÇ Ã³¸® --- 027 intsig.sa_handler = sig_int; 028 sigemptyset(&intsig.sa_mask); 029 intsig.sa_flags = 0; 030 if (sigaction(SIGINT, &intsig, 0) == -1) 031 { 032 printf ("signal(SIGINT) error"); 033 return -1; 034 } 035 // --------------------------------- 036 037 while(1) 038 { 039 printf("%d\n", i); 040 i++; 041 sleep(1); 042 } 043 } 044 045 void sig_int(int signo) 046 { 047 sigset_t sigset, oldset; 048 sigemptyset(&oldset); 049 050 // SIGUSR2¿Í SIGUSR1Àº ºí·°µÈ´Ù. 051 // ÀÌµé ½Ã±×³ÎÀº Çڵ鷯°¡ Á¾·áµÇ¸é Àü´ÞµÈ´Ù. 052 sigemptyset(&sigset); 053 sigaddset(&sigset, SIGUSR2); 054 sigaddset(&sigset, SIGUSR1); 055 if (sigprocmask(SIG_BLOCK, &sigset, &oldset) < 0) 056 { 057 printf("sigprocmask %d error \n", signo); 058 } 059 060 // SIGINT ¸¦ UNBLOCK ÇÑ´Ù. 061 // Çڵ鷯°¡ ¼öÇàÁßÀÌ´õ¶óµµ Áï½Ã Àü´ÞµÈ´Ù. 062 sigemptyset(&sigset); 063 sigaddset(&sigset, SIGINT); 064 if (sigprocmask(SIG_UNBLOCK, &sigset, &oldset) < 0) 065 { 066 printf("sigprocmask %d error \n", signo); 067 } 068 069 printf("sig_int\n"); 070 sleep(5); 071 } 072 073 void sig_usr(int signo) 074 { 075 printf("sig_usr2\n"); 076 } 077
|
|
||||||||||||||||||||||
|
|