longjmp() — 스택 환경 복원

형식

#include <setjmp.h>
void longjmp(jmp_buf env, int value);

언어 레벨

ANSI

스레드세이프

설명

longjmp() 함수는 setjmp() 함수에서 이전에 env에 저장한 스택 환경을 복원합니다. setjmp()longjmp() 함수는 비로컬 이동을 수행하기 위한 방법을 제공합니다. 종종 신호 핸들러에서 사용됩니다.

setjmp() 함수에 대한 호출로 현재 스택 환경이 env에 저장됩니다. longjmp()에 대한 후속 호출은 저장 환경을 복원하고 setjmp() 호출에 해당한 프로그램에 대한 위치 제어를 리턴합니다. 처리는 setjmp() 호출이 바로 지정된 value을 리턴한 것처럼 다시 시작합니다.

제어를 수신하는 함수에 사용 가능한(레지스터 변수 제외) 모두 변수는 longjmp()이 호출되었을 때 가지고 있는 값을 포함합니다. 레지스터 변수의 값은 예측 불가능합니다. setjmp()에 대한 호출과 longjmp() 함수 사이에 변경된 비휘발성 auto 변수도 예측 불가능합니다.
참고: 해당하는 longjmp() 함수를 호출하기 전에 setjmp() 함수를 호출하는 함수가 리턴하지 않는지 확인하십시오. setjmp() 함수를 호출하는 함수가 리턴된 후 longjmp()을 호출하면 예측 불가능한 프로그램 작동이 발생합니다.

value 인수는 0(영)이 아닌 값이어야 합니다. value으로 0 인수를 지정하면, longjmp()은 해당 위치에서 1을 대체합니다.

리턴값

longjmp() 함수는 일반 함수 호출과 리턴 메커니즘을 사용하지 않습니다. 리턴값이 없습니다.

이 예는 명령문에 스택 환경을 저장합니다.
   if (setjmp(mark) != 0) ...
시스템이 처음 if문을 수행하면, 환경을 mark에 저장하고, 환경을 저장할 때 setjmp() 함수가 0을 리턴하기 때문에 조건을 FALSE로 설정합니다. 프로그램은 메세지를 출력합니다.
   setjmp has been called

함수 p()에 대한 후속 호출로 longjmp() 함수가 호출됩니다. 제어는 mark 변수에 저장된 환경을 사용하여 setjmp() 함수에 대한 호출 후 바로 main() 함수의 포인터로 전송됩니다. 이 때, -1이 스택에 위치할 리턴값으로서 longjmp() 함수 호출에 두 번째 매개변수에 지정되기 때문에 조건은 TRUE입니다. 그런 다음 예는 명령문을 블록에서 수행하고, "longjmp() has been called" 메세지를 출력하고 recover() 함수를 호출하고 프로그램을 중단합니다.

#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>
 
jmp_buf mark;
 
void p(void);
void recover(void);
 
int main(void)
{
   if (setjmp(mark) != 0)
   {
      printf("longjmp has been called\n");
      recover();
      exit(1);
      }
   printf("setjmp has been called\n");
   printf("Calling function p()\n");
   p();
   printf("This point should never be reached\n");
}
 
void p(void)
{
   printf("Calling longjmp() from inside function p()\n");
   longjmp(mark, -1);
   printf("This point should never be reached\n");
}
 
void recover(void)
{
   printf("Performing function recover()\n");
}
/*******************Output should be as follows: **********************
 setjmp has been called
 Calling function p()
 Calling longjmp() from inside function p()
 longjmp has been called
 Performing function recover()
**********************************************************************/