Namespaces
Variants

longjmp

From cppreference.net
헤더 파일에 정의됨 <setjmp.h>
void longjmp ( jmp_buf env, int status ) ;
(C11 이전)
_Noreturn void longjmp ( jmp_buf env, int status ) ;
(C11 이후)
(C23 이전)
[ [ noreturn ] ] void longjmp ( jmp_buf env, int status ) ;
(C23 이후)

이전에 호출된 setjmp 가 저장한 실행 컨텍스트 env 를 로드합니다. 이 함수는 반환하지 않습니다. 제어는 env 를 설정한 setjmp 매크로의 호출 지점으로 전달됩니다. 해당 setjmp status 로 전달된 값을 반환합니다.

setjmp 를 호출한 함수가 반환되거나 스택 상위에서 다른 longjmp 에 의해 종료된 경우(어떤 방식으로든), 그 동작은 정의되지 않습니다. 즉, 호출 스택을 거슬러 올라가는 롱 점프만 허용됩니다.

다른 스레드를 가로지르는 점프(만약 setjmp 를 호출한 함수가 다른 스레드에 의해 실행된 경우) 또한 정의되지 않은 동작입니다.

(since C11)

setjmp 가 호출되었을 때 VLA 또는 다른 가변 수정 타입 변수가 스코프 내에 있었고 제어가 해당 스코프를 벗어난 경우, longjmp 를 사용하여 해당 setjmp 로 점프하는 것은 제어가 함수 내에 남아있더라도 미정의 동작을 유발합니다.

스택을 거슬러 올라가는 과정에서 longjmp 는 어떤 VLA도 해제하지 않으므로, 이들의 수명이 이러한 방식으로 종료되면 메모리 누수가 발생할 수 있습니다:

void g(int n)
{
    int a[n]; // a가 계속 할당된 상태로 남을 수 있음
    h(n); // 반환하지 않음
}
void h(int n)
{
    int b[n]; // b가 계속 할당된 상태로 남을 수 있음
    longjmp(buf, 2); // h의 b와 g의 a에 대해 메모리 누수를 유발할 수 있음
}
(C99부터)

목차

매개변수

env - setjmp 에 의해 저장된 프로그램 실행 상태를 참조하는 변수
status - setjmp 에서 반환할 값. 0 과 같으면 1 이 대신 사용됨

반환값

(없음)

참고 사항

longjmp 는 함수가 의미 있는 값을 반환할 수 없는 예상치 못한 오류 조건을 처리하기 위한 것입니다. 이는 다른 프로그래밍 언어의 예외 처리와 유사합니다.

예제

#include <stdio.h>
#include <setjmp.h>
#include <stdnoreturn.h>
jmp_buf my_jump_buffer;
noreturn void foo(int status) 
{
    printf("foo(%d) called\n", status);
    longjmp(my_jump_buffer, status + 1); // will return status+1 out of setjmp
}
int main(void)
{
    volatile int count = 0; // modified local vars in setjmp scope must be volatile
    if (setjmp(my_jump_buffer) != 5) // compare against constant in an if
        foo(++count);
}

출력:

foo(1) called
foo(2) called
foo(3) called
foo(4) called

참고문헌

  • C17 표준 (ISO/IEC 9899:2018):
  • 7.13.2.1 longjmp 매크로 (p: 191-192)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.13.2.1 longjmp 매크로 (p: 263-264)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.13.2.1 longjmp 매크로 (p: 244-245)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.6.2.1 longjmp 함수

참고 항목

컨텍스트 저장
(함수 매크로)