본문 바로가기
Computer Languages/C | C++

[Linux Programming] setjmp() / longjmp()

by blackcon 2015. 12. 3.

setjmp()와 longjmp()는 C언어의 goto문과 유사하지만 다소 차이가 있습니다.

goto문 같은 경우는 실행중의 EIP(또는 Program Count)만 변경되지만, setjmp()/longjmp()의 특징은 아래와 같습니다.

int setjmp( jmp_buf env )

  • 함수가 호출되는 순간 스택값들은 env에 저장됩니다.

  • setjmp()호출, longjmp할 곳을 지정합니다.

void longjmp( jmp_buf env, int val )

  • longjmp를 호출하면 setjmp()를 한 곳으로 돌아갑니다.
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#include <signal.h>
void p1();
void intHandler();
jmp_buf env;

int main()
{
    signal( SIGINT, intHandler );
    if( setjmp( env ) != 0 ){
        printf( "오류로 인해 복귀\n" );
        exit( 0 );
    }
    else
        printf( "처음 통과\n" );

    p1();
}

void p1()
{
    while( 1 ){
        printf( "루프\n" );
        sleep( 1 );
    }
}

void intHandler()
{
    printf( "인터럽트\n" );
    longjmp( env, 1 );
}