Namespaces
Variants

longjmp

From cppreference.net
Definido en el encabezado <setjmp.h>
void longjmp ( jmp_buf env, int status ) ;
(hasta C11)
_Noreturn void longjmp ( jmp_buf env, int status ) ;
(desde C11)
(hasta C23)
[ [ noreturn ] ] void longjmp ( jmp_buf env, int status ) ;
(desde C23)

Carga el contexto de ejecución env guardado por una llamada previa a setjmp . Esta función no retorna. El control se transfiere al sitio de llamada de la macro setjmp que configuró env . Ese setjmp luego retorna el valor, pasado como status .

Si la función que llamó a setjmp ha finalizado (ya sea por retorno o por un longjmp diferente más arriba en la pila), el comportamiento es indefinido. En otras palabras, solo se permiten saltos largos hacia arriba en la pila de llamadas.

Saltar entre hilos (si la función que llamó setjmp fue ejecutada por otro hilo) también es comportamiento indefinido.

(since C11)

Si cuando se llamó a setjmp , una variable de VLA u otro tipo modificable variable estaba en ámbito y el control abandonó ese ámbito, longjmp hacia ese setjmp invoca comportamiento indefinido incluso si el control permaneció dentro de la función.

Al ascender por la pila, longjmp no desasigna ningún VLA; pueden ocurrir fugas de memoria si sus vidas útiles terminan de esta manera:

void g(int n)
{
    int a[n]; // a may remain allocated
    h(n); // does not return
}
void h(int n)
{
    int b[n]; // b may remain allocated
    longjmp(buf, 2); // might cause a memory leak for h's b and g's a
}
(desde C99)

Contenidos

Parámetros

env - variable que hace referencia al estado de ejecución del programa guardado por setjmp
status - el valor a retornar desde setjmp . Si es igual a 0 , 1 se utiliza en su lugar

Valor de retorno

(ninguno)

Notas

longjmp está destinado para manejar condiciones de error inesperadas donde la función no puede retornar de manera significativa. Esto es similar al manejo de excepciones en otros lenguajes de programación.

Ejemplo

#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);
}

Salida:

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

Referencias

  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.13.2.1 La macro longjmp (p: 191-192)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.13.2.1 La macro longjmp (p: 263-264)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.13.2.1 La macro longjmp (p: 244-245)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.6.2.1 La función longjmp

Véase también

guarda el contexto
(macro de función)