[ 1Àå, 2Àå, 3Àå, 4Àå, 5Àå, 6Àå, 7Àå, 8Àå, 9Àå, 10Àå, 11Àå, 12Àå, 13Àå, 14Àå, 15Àå, 16Àå, 17Àå, 18Àå, 19Àå, 20Àå, 21Àå, 22Àå, 23Àå, 24Àå, 25Àå, 26Àå, 27Àå, ºÎ·ÏA, ºÎ·ÏB,C, ºÎ·ÏD, GNU C ¶óÀ̺귯¸® ¸ñ·Ï ]

À̱ÛÀº ÇÏÀÌÅÚ ¼ÒÇÁÆ®¿þ¾îµ¿È£È¸ÀÇ ¼Ò¸ðÀÓÀÎ Á÷ÀåÀÎÀ» À§ÇÑ ¾¾¸ðÀÓ¿¡¼­ ÀåÀå 2³â°£ÀÇ ´ëÀåÁ¤À¸·Î ¹ø¿ªµÇ¾îÁø ¹®¼­ÀÔ´Ï´Ù. Áö±ÝÀº Á÷¾¾ÀåÀ» Áö³»°í ÀÖ´Â ±è¼Ò¿µ(flpigy)´Ô°ú Á¶¿øºÀ(thirnine)´Ô, °í¼®°©´Ô(sukgab)ÀÇ °øµ¿¹ø¿ªÀÔ´Ï´Ù.

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´Â ¶ÇÇÑ ºí·ÏµÈ ½ÅÈ£µéÀÇ Áý ÇÕÀ» ¹ÝȯÇÑ´Ù.