setjmp/longjmp, 2002

@codemaru · October 21, 2011 · 2 min read

C언어를 가끔 사용하다 보면 이런 것들을 하고 싶을때가 있습니다. 이 함수를 넘어 저 함수로 이동하거나 함수의 경계를 넘나드는 어떤 처리를 하고 싶을때가 있죠. 처음 딱 생각하기에는 goto로 될 것 같지만, C언어의 goto에는 함수의 범위를 넘지 못하는 제약이 있습니다. 대신 목적을 위해 만들어진 함수 두개가 있습니다. 바로 setjmp, longjmp입니다. 이름 그대로 아주 먼 거리를 점프하는 함수죠. 그럼 실제 소스 코드를 볼까요??

#include 
#include 

jmp_buf pos; 

void proc() 
{ 
   static int i = 0; 

   ++i;
   if(i<10) 
       longjmp(pos, i); 

   return; 
} 

int main() 
{ 
   int a; 

   a = setjmp(pos); 
   printf("%d\n", a); 
   proc(); 
   return 0; 
}

결과는 각자 감상하시면서 한번씩 생각해 보시길 바랍니다. 참고로 jmp_buf는 상태를 저장하는 버퍼 구조체 입니다. 기본 원리는 setjmp는 현재 상태를 저장하고 longjmp이전 상태로 이동하는 역할을 하게 됩니다. 각자 한번 실행해 보시면 금방 아! 하시게 될겁니다.

그럼 다들 좋은 하루 되세요.

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중