20 ºñ-Áö¿ª Å»Ãâ
¶§¶§·Î ´ç½ÅÀÇ ÇÁ·Î±×·¥ÀÌ È£ÃâÇÑ ÇÔ¼öÀÇ ±í°Ô ³»Æ÷µÈ °÷¿¡¼ Æò¼Ò¿Í´Â ´Ù¸¥ »óȲÀ» °ËÃâÇÒ ¶§, ´ç ½ÅÀº Á¦¾î¼öÁØÀÇ ¹ÛÀ¸·Î Áï½Ã ¸®ÅÏÀÌ °¡´ÉÇϰÔ
µÇ´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù. ÀÌ ÀýÀº ±×¿Í°°Àº ºñ-Áö¿ª Å»ÃâÀÇ »óȲ¿¡¼
¾î¶»°Ô setjmp ¿Í longjmp¸¦ »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö¸¦ ¼³¸íÇÑ´Ù.
20.1 ºñ-Áö¿ª Å»Ãâµé¿¡ ´ëÇÑ ¾È³».
ºñ-Áö¿ª Å»ÃâÀÌ À¯¿ëÇÒ ¼ö ÀÖ´Â »óȲ¿¡ ´ëÇÑ ¿¹Á¦·Î¼, ÇÁ·ÒÇÁÆ® »ó¿¡¼ ¸í·É¹®À¸·Î ½ÇÇàÇÏ´Â "¸Þ ÀÎ ·çÇÁ"¸¦ °¡Áø, Áï »óÈ£ÀÛ¿ëÇÏ´Â ÇÁ·Î±×·¥ÀÌ ÀÖ´Ù°í °¡Á¤ÇÏÀÚ. ±×¸®°í "read"¶ó´Â ¸í·É¹®À¸·Î´Â ÆÄÀϷκÎÅÍ ÀÔ·ÂÀ» Àоî¼, ±×°ÍÀÌ Ã³¸®µÇ´Â µ¿¾È ÀÔ·ÂÀÇ ¾îÈÖ¿Í ±¸¹®À» ºÐ¼®ÇÑ´Ù°í °¡Á¤ÇÏÀÚ.±×¶§ ¸¸ÀÏ Àú-¼öÁØ ÀÔ·Â ¿¡·¯°¡ °ËÃâµÇ¸é, ¾îÈÖ¿Í ±¸¹®ºÐ¼® °¢°¢À» ¸¸µé°í, ³»Æ÷µÈ È£Ãâ¿¡ ÀÇÇØ °ËÃâµÈ ¿¡·¯»óȲÀ» ¸í¹éÇÏ°Ô Ãë±ÞÇÏ´Â ¸ðµç 󸮻óȲÀ» ¸¸µé±âº¸´Ù´Â "¸ÞÀÎ ·çÇÁ"·Î Áï½Ã ¸®ÅÏ °¡´ÉÇϵµ·Ï ÇÏ´Â °ÍÀÌ À¯¿ëÇÒ °ÍÀÌ´Ù.
( ´Ù¸¥ ÇÑÆíÀ¸·Î, ¸¸ÀÏ ÆÄÀϵéÀ» ´Ý°Å³ª, ¹öÆÛ³ª ´Ù¸¥ µ¥ÀÌÅÍ ±¸Á¶Ã¼¸¦ ÇØÁ¦ÇÏ´Â µîÀÇ ±×¿Í°°Àº exit ÀÇ »óȲÀÏ ¶§ ±×µé »óȲ¿¡¼ ±×µé¿¡°Ô ÇÒ´çµÈ ½ÇÁ¦ÀûÀÎ ¾çÀ» ¼Ò°ÅÇÑ´Ù¸é_º¸Åë ¸®ÅÏÀ» ÇÏ°í ±× ÀÚü °¡ ¼Ò°ÅµÇ´Â °ÍÀÌ ´õ Àû´çÇÒ ¼ö ÀÖ´Ù, ¿Ö³ÄÇÏ¸é ºñ-Áö¿ª Å»ÃâÀº ¹æÇصǴ »óȲµéÀ» ¹«½ÃÇÏ°í ±×µé¿¡ ¿¬°üµÈ Àüü Äڵ带 ¼Ò°ÅÇϱ⠶§¹®ÀÌ´Ù. ¼±ÅÃÀûÀ¸·Î ´ç½ÅÀº "¸ÞÀÎ ·çÇÁ"ÀÇ µÚ³ª ¶Ç´Â ¾Õ¿¡¼ ¸í¹é ÇÏ°Ô ¼Ò°Å¸¦ ÇÒ ¼ö ÀÖ´Ù.)
¾î¶² ¹æ¹ý¿¡¼, ºñ-Áö¿ª Å»ÃâÀº ÇÔ¼ö·ÎºÎÅÍ ¸®ÅÏÀ» ÇÏ´Â `return' ±¸¹®À» »ç¿ëÇϴ°Ͱú À¯»çÇÏ´Ù. ±×·¯³ª `return'Àº ¿ÀÁ÷ ´ÜÀÏÇÏ°Ô È£ÃâµÈ ÇÔ¼ö·Î ºÎÅÍ ºüÁ®³ª¿Í¼ ±×°ÍÀÌ È£ÃâµÇ¾ú´ø ÁöÁ¡ÀÇ µÚ·Î È£ÃâÀ» ³Ñ±âÁö¸¸, ºñ-Áö¿ª Å»ÃâÀº ³»Æ÷µÈ ÇÔ¼ö È£ÃâÀÇ ¿©·¯´Ü°è¸¦ ºüÁ®³ª¿Ã ¼ö ÀÖ´Ù.
´ç½ÅÀº setjmp ÇÔ¼ö¸¦ È£ÃâÇØ¼ ºñ-Áö¿ª Å»ÃâÀ» À§ÇÑ ¸®ÅÏÁöÁ¡À» È®ÀÎÇ϶ó. ÀÌ ÇÔ¼ö´Â objectÀÇ Å¸ ÀÔ jmp_buf¾È¿¡ ½ÇÇàȯ°æ¿¡ ´ëÇÑ Á¤º¸¸¦ ÀúÀåÇÑ´Ù. setjmpÀÇ È£ÃâÈÄ¿¡µµ ÇÁ·Î±×·¥ÀÇ ½ÇÇàÀº Á¤»óÀû À¸·Î °è¼ÓµÇÁö¸¸, ¸¸ÀÏ ÇÑ exit°¡ ±×°Í¿¡ ºÎÇյǴ jmp_buf ¿ÀºêÁ§Æ®¸¦Àμö·Î ÇÏ¿© longjmp¸¦ È£Ãâ ÇÔÀ¸·Î½á ÀÌ ¸®ÅÏ ÁöÁ¡º¸´Ù ³ªÁß¿¡ ¸¸µé¾îÁ³´Ù¸é Á¦¾î´Â setjmp°¡ È£ÃâµÇ¾ú´ø ±× ÁöÁ¡ÀÇ µÚ·Î ³Ñ°Ü Áø´Ù. setjmp·Î ºÎÅÍÀÇ ¸®ÅϰªÀº, º¸ÅëÀÇ ¸®Åϰú longjmp¸¦ È£ÃâÇÔÀ¸·Î ÇØ¼ ¸¸µé¾îÁø ¸®ÅϰúÀÇ ±¸ º°ÇϱâÀ§ÇØ »ç¿ëµÇ¹Ç·Î, setjmp´Â º¸Åë `if'¹®¾È¿¡ ³ªÅ¸³´Ù.
À§¿¡ ¼³¸íµÈ ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ ¾î¶»°Ô ¸¸µé¾îÁö´ÂÁö¸¦ º¸¿©ÁØ´Ù.
#include <setjmp.h>
#include <stdlib.h>
#include <stdio.h>
jmp_buf main_loop;
void
abort_to_main_loop (int status)
{
longjmp (main_loop, status);
}
int
main (void)
{
while (1)
if (setjmp (main_loop))
puts("Back at main loop....");
else
do_command();
}
void
do_command(void)
{
char buffer[128];
if (fgets (buffer, 128, stdin) == NULL)
abort_to_main_loop (-1);
else
exit (EXIT_SUCCESS);
}
ÇÔ¼ö abort_to_main_loop´Â ±×°ÍÀÌ ¾îµð·ÎºÎÅÍ È£ÃâµÇ¾ú´ÂÁö¿¡ »ó°ü¾øÀÌ, ÇÁ·Î±×·¥ÀÇ ¸ÞÀηçÇÁ·Î Á¦¾î¸¦ Áï½Ã µ¹·ÁÁØ´Ù.
¸ÞÀÎ ÇÔ¼ö ¾ÈÀÇ Á¦¾îÀÇ È帧Àº óÀ½¿¡ Á¶±Ý ÀÌ»óÇÑÀÏÀÌ ¹ß»ýÇÒÁöµµ ¸ð¸£Áö¸¸, ±×·¯³ª ±×°ÍÀº ½ÇÁ¦ ·Î setjmp¿¡¼ »ç¿ëÇÏ´Â º¸ÅëÀÇ °ü¿ëÀÌ´Ù. setjmp´Â º¸Åë 0À» ¸®ÅÏÇϹǷÎ, ±×·¡¼ Á¶°ÇÀý "else"°¡ ½ÇÇàµÇ¾îÁø´Ù. ¸¸ÀÏ abort_to_main_loop°¡ do_commandÀÇ ½ÇÇàÁß¿¡ ¾î´À°÷¿¡¼ È£ÃâµÇ¾îÁö¸é, ±×°Í Àº ¸ÞÀο¡¼ setjmp¸¦ È£ÃâÇϴ°Íó·³ ³ªÅ¸³´Ù. ±×·¡¼ setjmp¸¦ »ç¿ëÇÏ´Â ÀϹÝÀû ¾ç½ÄÀº ´ÙÀ½°ú °°´Ù:
if (setjmp (buffer))
/* ¶§À̸¥ ¸®ÅÏÈÄ¿¡ ¼Ò°ÅÇÏ·Á´Â ÄÚµå */
. . .
else
/* ¸®ÅÏ ÁöÁ¡À» ¼³Á¤ÇÑ ÈÄ¿¡ ÀϹÝÀûÀ¸·Î ½ÇÇàµÇ¾îÁö´Â ÄÚµå */
. . .
20.2 ºñ-Áö¿ª ºÐ±âÀÇ »ó¼¼ÇÑ ¼³¸í.
¿©±â¿¡¼´Â ºñ-Áö¿ª ºÐ±â¸¦ ¼öÇàÇϱâ À§ÇØ »ç¿ëµÇ´Â ÇÔ¼öµé°ú µ¥ÀÌÅÍ ±¸Á¶Ã¼¿¡ ´ëÇØ¼ ¼³¸íÇÑ´Ù. ÀÌµé µµ±¸µéÀº `setjmp.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
µ¥ÀÌÅÍ Å¸ÀÔ : jmp__buf
¿ÀºêÁ§Æ®ÀÇ Å¸ÀÔ jmp_buf´Â ºñ-Áö¿ª ºÐ±â¿¡ÀÇÇØ µÇµ¹·ÁÁú »óȲ Á¤º¸¸¦ ÀúÀåÇÑ´Ù. jum_bufÀÇ ³»¿ë µéÀº ¸®ÅÏÇϱâ À§ÇÑ ÁöÁ¤µÈ Àå¼Ò¸¦ ¾Ë¸°´Ù.
¸ÅÅ©·Î : int setjmp (jmp_buf state)
º¸Åë È£ÃâµÇ¾úÀ» ¶§, setjmp´Â state¾È¿¡ ÇöÀç ½ÇÇàÁßÀÎ ÇÁ·Î±×·¥ÀÇ »óȲ¿¡ ´ëÇÑ Á¤º¸¸¦ ÀúÀåÇϰí 0 À» ¸®ÅÏÇÑ´Ù. ¸¸ÀÏ longjmp°¡ ÀÌ state·Î ºñ-Áö¿ª ºÐ±â¸¦ ¼öÇàÇϱâÀ§ÇØ ³ªÁß¿¡ »ç¿ëµÈ´Ù¸é, setjmp ´Â 0ÀÌ ¾Æ´Ñ°ªÀ» ¸®ÅÏÇÑ´Ù.
ÇÔ¼ö : void longjmp (jmp_buf state, int value)
ÀÌ ÇÔ¼ö´Â state¿¡ ÀúÀåµÈ »óȲÀ¸·Î ÇöÀç ½ÇÇàÀ» µÇµ¹¸®°í, ¸®ÅÏ ÁöÁ¡À» ¸¸µé¾ú´ø setjmp¸¦ È£ÃâÇÑ ÁöÁ¡ºÎÅÍ ½ÇÇàÀ» °è¼ÓÇÑ´Ù. longjmp¿¡ ÀÇÇÑ setjmp·ÎºÎÅÍÀÇ ¸®ÅÏÀº longjmp¿¡ ÁÖ¾îÁ³´ø 0ÀÌ ¾Æ´Ñ Àμö°ªÀ» ¸®ÅÏÇÑ´Ù. (±×·¯³ª ¸¸ÀÏ °ªÀÌ 0À¸·Î ÁÖ¾îÁö¸é, setjmp´Â 0À» ¸®ÅÏÇÑ´Ù. )
setjmp¿Í longjmpÀÇ »ç¿ë¿¡´Â ¸¹ÀÌ ¸ðÈ£ÇÏÁö¸¸ Áß¿äÇÑ Á¦ÇѵéÀÌ ÀÖ´Ù. À̵é Á¦ÇÑÀÇ ´ëºÎºÐÀº ºñ- Áö¿ª ºÐ±â°¡ C ÄÄÆÄÀϻ󿡼 »ó´çÇÑ ¾çÀÇ ½ÅºñÇÑ Èû(?)À» ¿ä±¸Çß°í ÀÌ»óÇÑ ¹æ¹ýÀ¸·Î ¾ð¾îÀÇ ´Ù¸¥ ºÎ ºÐµé°ú ÇÔ²² ¿µÇâÀ» ³¢Ä¥¼ö Àֱ⠶§¹®¿¡ ¹ß»ýÇÑ´Ù.
setjmpÇÔ¼ö´Â ÇÔ¼öÁ¤Àǰ¡ ¾ø´Â ¸ÅÅ©·ÎÀÌ´Ù, ±×·¡¼ ´ç½ÅÀº `#undef¸¦ »ç¿ëÇϰųª ¶Ç´Â ±×°ÍÀÇ ÁÖ¼Ò ¸¦ ÃëÇÏ·Á ÇÒ ¼ö°¡ ¾ø´Ù. ±×°Í¿¡ ´õÇÏ¿©, setjmp¸¦ È£ÃâÇÏ´Â °ÍÀº ¿ÀÁ÷ ´ÙÀ½°ú °°Àº °æ¿ì¿¡¸¸ ¾ÈÀü ÇÏ´Ù.
둁 ¼±ÅÃÀ̳ª ¹Ýº¹±¸¹®À» ½ÃÇèÇϱâÀ§ÇÑ Ç¥ÇöÀ¸·Î(`if' ¶Ç´Â `while'¿Í °°Àº)
둁 ¼±ÅÃÀ̳ª ¹Ýº¹±¸¹®À» ½ÃÇèÇϱâÀ§ÇÑ Ç¥ÇöÀ¸·Î »ç¿ëÇÑ µ¿µî ¶Ç´Â ºñ±³ ¿¬»êÀÚ¿¡¼ »ç¿ëµÈ ÇÇ¿¬»ê ÀÚÀÇ Çϳª·Î½á. ±×¶§ ´Ù¸¥ ÇÇ¿¬»êÀÚ´Â Á¤¼ö »ó¼ö Ç¥ÇöÀ̾î¾ß¸¸ ÇÑ´Ù.
둁 ¼±ÅÃÀ̳ª ¹Ýº¹±¸¹®À» ½ÃÇèÇϱâ À§ÇÑ Ç¥ÇöÀ¸·Î »ç¿ëÇÑ ´ÜÇ׿¬»êÀÚ`!'ÀÇ ÇÇ¿¬»êÀÚ·Î »ç¿ëÇÒ¶§.
둁 Ç¥Çö½ÄÀ¸·Î ÀÚü·Î »ç¿ëÇÒ¶§.
¸®ÅÏÁöÁ¡Àº ±×µéÀ» ¸¸µé±â À§Çؼ setjmp¸¦ È£ÃâÇß´ø ±× ÇÔ¼ö°¡ °è¼Ó ÀÛµ¿Çϰí ÀÖÀ»¶§¸¸ À¯¿ëÇÏ´Ù. ¸¸ÀÏ ´ç½ÅÀÌ ÀÌ¹Ì ¸®ÅϵǾîÁø ÇÔ¼ö¿¡¼ ¸¸µé¾ú´ø ¸®ÅÏÁöÁ¡À¸·Î longjmp¸¦ È£ÃâÇϸé, ¿¹ÃøÇÒ ¼ö ¾ø°í ºÒÇàÇÑ ÀϵéÀÌ ¹ß»ýµÉ °ÍÀÌ´Ù.
´ç½ÅÀº longjmpÀÇ Àμö·Î½á 0ÀÌ ¾Æ´Ñ°ªÀ» »ç¿ë¼öµµ ÀÖ´Ù. longjmp´Â setjmp·ÎºÎÅÍÀÇ ¸®ÅϰªÀÎ 0 Àμö¸¦ µÇµ¹·ÁÁֱ⸦ °ÅºÎÇϹǷÎ, °©Àڱ⠹߻ýÇÏ´Â ½Ç¼öµé¿¡ ´ëÇ×ÇÑ ¾ÈÀü¸ÁÀ¸·Î½áÀÇ ¿ªÇÒÀ» ÇÒ ¼öµµ ÀÖÁö¸¸ ÁÁÀº ÇÁ·Î±×·¡¹Ö ½ºÅ¸ÀÏÀº ¾Æ´Ï´Ù.
´ç½ÅÀÌ ºñ-Áö¿ª ºÐ±â¸¦ ¼öÇàÇÒ ¶§, °Ë»ö°¡´ÉÇÑ ¿ÀºêÁ§Æ®µéÀº longjmp°¡ È£ÃâµÇ¾úÀ» ¶§ ±×µéÀÌ °¡Á³ ´ø °ªÀÌ ¹«¾ùÀ̵çÁö ÀϹÝÀûÀ¸·Î °è¼Ó À¯ÁöÇÑ´Ù. ±×·¯³ª ÀÚµ¿ Áö¿ªº¯¼öÀÇ °æ¿ì¿¡´Â setjmp°¡ È£ÃâµÈ ÀÌÈÄ¿¡ º¯°æµÈ´Ù. Áï ±×µéÀ» Èֹ߼ºÀ¸·Î ¼±¾ðÇÏÁö¸¸ ¾ÊÀ¸¸é ±×µéÀº º¯°æµÇÁö ¾Ê´Â´Ù.
20.3 ºñ-Áö¿ª ºÐ±â¿Í ½ÅÈ£.
BSD À¯´Ð½º ½Ã½ºÅÛ¿¡¼, setjmp¿Í longjmp´Â ºí·ÏµÈ ½ÅÈ£µéÀ» ÀúÀåÇÏ°í ¹ÝȯÇÑ´Ù; 21.7Àý [Blocking Signals] 298 ÆäÀÌÁö ÂüÁ¶. ±×·¸Áö¸¸, POSIX.1 Ç¥ÁØÀº setjmp¿Í longjmp°¡ ºí·ÏµÈ ½ÅÈ£µé À» º¯°æÇÏÁö ¾ÊÀ» °ÍÀ» ¿ä±¸Çϰí, BSDó·³ ÇൿÇϱâ À§ÇÑ ÇÔ¼öµé(sigsetjmp¿Ísiglongjmp) µÎ °³¸¦ ºÎ°¡ÀûÀ¸·Î Á¦°øÇÑ´Ù.
GNU ¶óÀ̺귯¸®¿¡¼ setjmp¿Í longjmpÀÇ ÇൿÀº Å×½ºÆ® ¸ÅÅ©·Î¿¡ÀÇÇØ Á¦¾îµÈ´Ù; 1.3.4Àý [Feature Test Macros] 6ÆäÀÌÁö ÂüÁ¶. GNU ½Ã½ºÅÛ¿¡¼ µðÆúÆ®·Î »ç¿ëÇÏ´Â °ÍÀº BSD°¡ ¾Æ´Ï¶ó POSIX.1 ÀÌ´Ù. ÀÌÀý¿¡ ÀÖ´Â µµ±¸µéÀº Çì´õÆÄÀÏ `setjmp.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
µ¥ÀÌÅÍ Å¸ÀÔ : sigjmp__buf
À̰ÍÀº ºí·ÏµÈ ½ÅÈ£µé¿¡ ´ëÇÑ »óȲ Á¤º¸¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» Á¦¿ÜÇϰí´Â jmp_buf¿Í À¯»çÇÏ´Ù.
ÇÔ¼ö : int sigsetjmp (sigjmp_buf state, int savesigs)
À̰ÍÀº setjmp¿Í À¯»çÇÏ´Ù. ¸¸ÀÏ savesigs°¡ 0ÀÌ ¾Æ´Ï¸é, ºí·ÏµÈ ½ÅÈ£µéÀÇ ÁýÇÕÀº state¿¡ ÀúÀåµÇ°í ¸¸ÀÏ siglongjmp°¡ ³ªÁß¿¡ ÀÌ state¸¦ °¡Áö°í ¼öÇàµÇ¸é ¹ÝȯµÇ¾îÁú °ÍÀÌ´Ù
ÇÔ¼ö : void siglingjmp (sigjmp_buf state, int value)
À̰ÍÀº stateÀμöÀÇ Å¸ÀÔÀÌ ´Ù¸£´Ù´Â °ÍÀ» Á¦¿ÜÇϰí´Â longjmp¿Í À¯»çÇÏ´Ù. ¸¸ÀÏ 0ÀÌ ¾Æ´Ñ savesigs Ç÷¡±×¸¦ »ç¿ëÇß´ø state¸¦ ¼³Á¤Çϰí sigsetjmp¸¦ È£ÃâÇϸé, siglongjmp´Â ¶ÇÇÑ ºí·ÏµÈ ½ÅÈ£µéÀÇ Áý ÇÕÀ» ¹ÝȯÇÑ´Ù.