longjmp
| 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 entonces devuelve el valor, pasado como status.
Si la función que llamó a setjmp ha terminado (ya sea por return o por otro longjmp 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.
|
El salto entre hilos (si la función que llamó a |
(desde C11) |
|
Si cuando setjmp fue llamado, una variable de tipo VLA u otro tipo modificable variablemente estaba en alcance y el control abandonó ese alcance, En el camino hacia arriba en la pila, 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) |
Parámetros
| env | - | variable que se refiere al estado de ejecución del programa guardado por setjmp |
| status | - | el valor que debe devolver setjmp. Si es igual a 0, se usa 1 en su lugar
|
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 <setjmp.h>
#include <stdio.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 C23 (ISO/IEC 9899:2024):
- 7.13.2.1 La macro longjmp (p: 283-284)
- 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) | |
Documentación de C++ para longjmp
| |