Función longjmp ANSI C

void longjmp(jmp_buf entorno, int valor);

Restaura el entorno guardado por la invocación más reciente de la función setjmp en la misma invocación del programa, con el argumento correspondiente entorno. Si no ha habido tal invocación, o si una función conteniendo la invocación de la función setjmp ha terminado la ejecución en el ínterino, el comportamiento no está definido.

Todos los objetos accesibles tienen valores como en el momento longjmp fue llamada, excepto que los valores de los objetos de duración de almacenaje automático que son locales a la función conteniendo la invocación de la función correspondiente setjmp que no son del tipo volatile y han sido cambiados entre la invocación de setjmp y la invocación longjmp son indeterminados.

Mientras se salta las llamadas usuales a funciones y los mecanismos de retorno, longjmp ejecutará correctamente en contexto de interruptores, señales, y cualquiera de sus funciones asociadas. Sin embargo, si la función longjmp es invocada desde un controlador de señales anidado (esto es, desde una función invocada como el resultado de una señal generada durante el proceso de otra señal), el comportamiento no está definido.

Después de que longjmp es completada, la ejecución del programa continúa como si la invocación correspondiente de la función setjmp acabara de retornar el valor especificado por valor. La función longjmp no puede causar la función setjmp retornar el valor 0; si valor es 0, la función setjmp retorna el valor de 1.

Valor de Retorno:

Esta función no retorna ningún valor.

Ejemplo:

#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>

void salto( jmp_buf saltimbanqui, int v )
{
   longjmp( saltimbanqui, v );
}

int main()
{   
   int valor;
   jmp_buf entorno;

   printf( "longjmp y setjmp son una forma de simular el \'goto\'\n\n" );

   valor = setjmp( entorno );   /* Volveremos aqu¡ */
   if( valor != 0 ) 
   {
      printf( "Longjmp con el valor: %d\n", valor );
      exit( valor );
   }

   printf( "Vamos a saltar ... \n" );
   salto( entorno, 1 );         /* Salta al momento de setjmp() */

   return 0;
}