<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-menu-disabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-os vector-sticky-header-enabled skin-thumbsize-clientpref-standard" lang="es" dir="ltr"><head>
    <meta charset="UTF-8">
    <title>Setjmp.h</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="icon" type="image/png" href="./_res_/favicon.png">
    <link rel="canonical" href="https://es.wikipedia.org/wiki/Setjmp.h"> <link href="./_mw_/ext.cite.parsoid.styles.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/mediawiki.skinning.content.parsoid.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
    <meta name="ResourceLoaderDynamicStyles" content="">
    <link href="./_mw_/ext.gadget.imagenesinfobox.css" rel="stylesheet" type="text/css">
    <link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
    <link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
    <link rel="stylesheet" type="text/css" href="./_res_/footer.css">
    <link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
  </head>
  <body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Setjmp_h rootpage-Setjmp_h skin-vector-2022 action-view">
    <div class="mw-page-container">
      <div class="mw-page-container-inner">
        <div class="mw-content-container">
          <main id="content" class="mw-body">
            <header class="mw-body-header vector-page-titlebar">
              <h1 id="firstHeading" class="firstHeading mw-first-heading">setjmp.h</h1>
            </header>
            <a id="top"></a>
            <div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
              <div id="contentSub">
                <div id="mw-content-subtitle"></div>
              </div>
              <div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="es" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="es" dir="ltr" data-mw-parsoid-version="0.24.0.0-alpha4" data-mw-html-version="2.8.0"><section data-mw-section-id="0" id="mwAQ"><span typeof="mw:Transclusion" id="mwAg"></span>


<p id="mwBA"><b id="mwBQ">setjmp.h</b> es un <a rel="mw:WikiLink" href="Archivo_de_cabecera" title="Archivo de cabecera" id="mwBg">encabezado</a> definido en la <a rel="mw:WikiLink" href="Biblioteca_est%C3%A1ndar_de_C" title="Biblioteca estándar de C" id="mwBw">biblioteca estándar de C</a> para proporcionar "saltos no locales": <a rel="mw:WikiLink" href="Estructuras_de_control" title="Estructuras de control" id="mwCA">control de flujo</a> que se desvía de la llamada a <a rel="mw:WikiLink" href="Subrutina" title="Subrutina" id="mwCQ">subrutina</a> habitual y la secuencia de retorno. Las funciones complementarias <b id="mwCg"><code id="mwCw">setjmp</code></b> y <b id="mwDA"><code id="mwDQ">longjmp</code></b> proporcionan esta funcionalidad.</p>

<p id="mwDg">Un uso típico de <code id="mwDw">setjmp</code>/<code id="mwEA">longjmp</code> es la implementación de un <a rel="mw:WikiLink" href="Manejo_de_excepciones" title="Manejo de excepciones" id="mwEQ">mecanismo de excepción</a> que utiliza la capacidad de <code id="mwEg">longjmp</code> para restablecer el estado del programa o hilo, incluso a través de múltiples niveles de las llamadas a funciones. Un uso menos común de <code id="mwEw">setjmp</code> es crear una sintaxis similar a corrutinas.</p>

</section><section data-mw-section-id="1" id="mwFg" aria-labelledby="Funciones_miembro"><div class="mw-heading mw-heading2"><h2 id="Funciones_miembro">Funciones miembro</h2></div>

<table class="wikitable" id="mwFw">
<tbody id="mwGA"><tr id="mwGQ">
<td id="mwGg"><code id="mwGw">int setjmp(jmp_buf<span typeof="mw:Entity" id="mwHA">&nbsp;</span>env)</code></td><td id="mwHQ">Establece el buffer <code id="mwHg">jmp_buf</code> local y lo inicializa para el salto. Esta rutina<sup class="mw-ref reference" id="cite_ref-macro_1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-macro-1" id="mwHw"><span class="mw-reflink-text" id="mwIA"><span class="cite-bracket" id="mwIQ">[</span>1<span class="cite-bracket" id="mwIg">]</span></span></a></sup> guarda el contexto de la llamada del programa en el búfer de contexto especificado por el argumento <code id="mwIw">env</code> para su uso posterior por <code id="mwJA">longjmp</code>. Si el retorno es de una invocación directa, <code id="mwJQ">setjmp</code> devuelve 0. Si el retorno es de una llamada a <code id="mwJg">longjmp</code>, <code id="mwJw">setjmp</code> devuelve un valor distinto de cero.</td></tr>
<tr id="mwKA">
<td id="mwKQ"><code id="mwKg">void longjmp(jmp_buf<span typeof="mw:Entity" id="mwKw">&nbsp;</span>env, int<span typeof="mw:Entity" id="mwLA">&nbsp;</span>value)</code></td><td id="mwLQ">Restaura el contexto del buffer de entorno <code id="mwLg">env</code> que se salvó por invocación de la rutina<sup class="mw-ref reference" id="cite_ref-macro_1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-macro-1" id="mwLw"><span class="mw-reflink-text" id="mwMA"><span class="cite-bracket" id="mwMQ">[</span>1<span class="cite-bracket" id="mwMg">]</span></span></a></sup> en la misma invocación del programa. Invocando longjmp desde un manejador de señales anidado <a rel="mw:WikiLink" href="Comportamiento_indefinido" title="Comportamiento indefinido" id="mwMw">no definido</a>. El valor especificado por <code id="mwNA">valor</code> es pasado desde <code id="mwNQ">longjmp</code> a <code id="mwNg">setjmp</code>. Después de que <code id="mwNw">longjmp</code> se completa, la ejecución del programa continúa como si la invocación correspondiente de <code id="mwOA">setjmp</code> acabara de regresar. Si el <code id="mwOQ">valor</code> pasado a <code id="mwOg">longjmp</code> es 0, <code id="mwOw">setjmp</code> se comportará como si hubiera devuelto 1;, de lo contrario, se comportará como si hubiera devuelto un <code id="mwPA">valor</code>.</td></tr>
<tr class="mw-empty-elt" id="mwPQ"></tr>
</tbody></table>

<p id="mwPg"><code id="mwPw">setjmp</code> guarda el contexto actual (Ej., el estado del programa) en algún punto de la ejecución del programa, en una <a rel="mw:WikiLink" href="Estructura_de_datos" title="Estructura de datos" id="mwQA">estructura de datos</a> específica de la plataforma (<code id="mwQQ">jmp_buf</code>) que puede ser usada, en un punto más lejano de la ejecución del programa, por <code id="mwQg">longjmp</code> para restaurar el estado del programa que fue guardado por <code id="mwQw">setjmp</code> en <code id="mwRA">jmp_buf</code>. Este proceso puede representarse como un "salto" atrás hacia el punto de la ejecución del programa donde <code id="mwRQ">setjmp</code> guardo el contexto. El (aparente) valor de retorno de <code id="mwRw">setjmp</code> indica si el control alcanzado el punto de normalidad o de una llamada a <code id="mwSA"> longjmp </code>. Esto lleva a un común idioma: <code id="mwSg">if( setjmp(x) ){/* manejar longjmp(x) */}</code>.</p>

<p id="mwSw"><a rel="mw:WikiLink" href="POSIX" title="POSIX" id="mwTA">POSIX</a>.1 no especifica si <code id="mwTQ">setjmp</code> y <code id="mwTg">longjmp</code> guardan o restauran el conjunto actual de bloqueo de <a rel="mw:WikiLink" href="Se%C3%B1al_(inform%C3%A1tica)" title="Señal (informática)" id="mwTw">señales</a> — si un programa cuenta con manejo de señales que debería usarlas instrucciones POSIX <code id="mwUA">sigsetjmp</code>/<code id="mwUQ">siglongjmp </code>.</p>

</section><section data-mw-section-id="2" id="mwUg" aria-labelledby="Tipos_Miembro"><div class="mw-heading mw-heading2"><h2 id="Tipos_Miembro">Tipos Miembro</h2></div>

<table class="wikitable" id="mwUw">
<tbody id="mwVA"><tr id="mwVQ">
<td id="mwVg"><code id="mwVw">jmp_buf</code></td><td id="mwWA">Un tipo de array, como <code id="mwWQ">struct __jmp_buf_tag[1]</code>,<sup class="mw-ref reference" id="cite_ref-2" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2" id="mwWg"><span class="mw-reflink-text" id="mwWw"><span class="cite-bracket" id="mwXA">[</span>2<span class="cite-bracket" id="mwXQ">]</span></span></a></sup> apropiado para manejar la información necesaria para restaurar el contexto desde una llamada a sistema.</td></tr>
</tbody></table>

</section><section data-mw-section-id="3" id="mwXg" aria-labelledby="Advertencias_y_limitaciones"><div class="mw-heading mw-heading2"><h2 id="Advertencias_y_limitaciones">Advertencias y limitaciones</h2></div>
<p id="mwXw">Cuando un "goto no-local" se ejecuta a través de setjmp / longjmp, el "desenrolle de pila" normal no ocurre y por lo tanto, las acciones de limpieza necesarios, tales como el cierre de descriptores de archivos, el vaciado de los búferes, la liberación de la memoria asignada en el heap, etc., no ocurren.</p>

<p id="mwYA">Si la función en la que fue llamada setjmp retorna, ya no es posible utilizar de forma segura longjmp con el objeto jmp_buf correspondiente. Esto es así porque el marco de pila se invalida cuando se devuelve la función. Llamar a longjmp restablece el puntero de pila, que -ya que la función retorna- apuntaría a un marco de pila inexistente y posiblemente sobrescrito o dañado.<sup class="mw-ref reference" id="cite_ref-3" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-3" id="mwYQ"><span class="mw-reflink-text" id="mwYg"><span class="cite-bracket" id="mwYw">[</span>3<span class="cite-bracket" id="mwZA">]</span></span></a></sup><sup class="mw-ref reference" id="cite_ref-4" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-4" id="mwZQ"><span class="mw-reflink-text" id="mwZg"><span class="cite-bracket" id="mwZw">[</span>4<span class="cite-bracket" id="mwaA">]</span></span></a></sup></p>

<p id="mwaQ">Del mismo modo, C99 no requiere que longjmp preserve el marco de pila actual. Esto significa que saltar a una función que sale a través de una llamada a longjmp no está definido.<sup class="mw-ref reference" id="cite_ref-ISO/IEC_9899:1999_5-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-ISO/IEC_9899:1999-5" id="mwag"><span class="mw-reflink-text" id="mwaw"><span class="cite-bracket" id="mwbA">[</span>5<span class="cite-bracket" id="mwbQ">]</span></span></a></sup> Sin embargo, la mayoría de las implementaciones de longjmp dejan intacto el marco de pila, lo que permite a setjmp y longjmp ser utilizados para saltar hacia atrás y hacia adelante entre dos o más funciones -una característica explotada para la multitarea-.</p>

<p id="mwbg">En comparación con los mecanismos de lenguajes de programación de alto nivel como Python, Java, C + +, C #, e incluso lenguajes pre-C como Algol 60, la técnica de usar setjmp / longjmp para implementar un mecanismo de excepción es engorrosa. Estos lenguajes proporcionan técnicas de manejo de excepciones más potentes, mientras que lenguajes como <a rel="mw:WikiLink" href="Scheme" title="Scheme" id="mwbw">Scheme</a>, <a rel="mw:WikiLink" href="Smalltalk" title="Smalltalk" id="mwcA">Smalltalk</a>, y Haskell proporcionan construcciones de manejo de continuidad incluso más generales.</p>

</section><section data-mw-section-id="4" id="mwcQ" aria-labelledby="Ejemplos_de_uso"><div class="mw-heading mw-heading2"><h2 id="Ejemplos_de_uso">Ejemplos de uso</h2></div>

<section data-mw-section-id="5" id="mwcg" aria-labelledby="Ejemplo_simple"><div class="mw-heading mw-heading3"><h3 id="Ejemplo_simple">Ejemplo simple</h3></div>
<p id="mwcw">Este ejemplo muestra la idea básica de setjmp. La función main llama a first, la cual a su vez llama a second. La función "second" salta de vuelta a la función main, omitiendo la ejecución de la instrucción printf de la función "first". </p>

<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr" typeof="mw:Extension/syntaxhighlight" id="mwdA"><pre id="mwdQ"><span id="mwdg"></span><span class="cp" id="mwdw">#include</span><span class="w" id="mweA"> </span><span class="cpf" id="mweQ">&lt;stdio.h&gt;</span>
<span class="cp" id="mweg">#include</span><span class="w" id="mwew"> </span><span class="cpf" id="mwfA">&lt;setjmp.h&gt;</span>

<span class="k" id="mwfQ">static</span><span class="w" id="mwfg"> </span><span class="kt" id="mwfw">jmp_buf</span><span class="w" id="mwgA"> </span><span class="n" id="mwgQ">buf</span><span class="p" id="mwgg">;</span>

<span class="kt" id="mwgw">void</span><span class="w" id="mwhA"> </span><span class="nf" id="mwhQ">second</span><span class="p" id="mwhg">(</span><span class="kt" id="mwhw">void</span><span class="p" id="mwiA">)</span><span class="w" id="mwiQ"> </span><span class="p" id="mwig">{</span>
<span class="w" id="mwiw">    </span><span class="n" id="mwjA">printf</span><span class="p" id="mwjQ">(</span><span class="s" id="mwjg">"second</span><span class="se" id="mwjw">\n</span><span class="s" id="mwkA">"</span><span class="p" id="mwkQ">);</span><span class="w" id="mwkg">         </span><span class="c1" id="mwkw">// Impresiones</span>
<span class="w" id="mwlA">    </span><span class="n" id="mwlQ">longjmp</span><span class="p" id="mwlg">(</span><span class="n" id="mwlw">buf</span><span class="p" id="mwmA">,</span><span class="mi" id="mwmQ">1</span><span class="p" id="mwmg">);</span><span class="w" id="mwmw">             </span><span class="c1" id="mwnA">// salta de nuevo a donde fue llamado setjmp</span>
<span class="p" id="mwnQ">}</span>

<span class="kt" id="mwng">void</span><span class="w" id="mwnw"> </span><span class="nf" id="mwoA">first</span><span class="p" id="mwoQ">(</span><span class="kt" id="mwog">void</span><span class="p" id="mwow">)</span><span class="w" id="mwpA"> </span><span class="p" id="mwpQ">{</span>
<span class="w" id="mwpg">    </span><span class="n" id="mwpw">second</span><span class="p" id="mwqA">();</span>
<span class="w" id="mwqQ">    </span><span class="n" id="mwqg">printf</span><span class="p" id="mwqw">(</span><span class="s" id="mwrA">"first</span><span class="se" id="mwrQ">\n</span><span class="s" id="mwrg">"</span><span class="p" id="mwrw">);</span><span class="w" id="mwsA">          </span><span class="c1" id="mwsQ">// No se Imprime</span>
<span class="p" id="mwsg">}</span>

<span class="kt" id="mwsw">int</span><span class="w" id="mwtA"> </span><span class="nf" id="mwtQ">main</span><span class="p" id="mwtg">()</span><span class="w" id="mwtw"> </span><span class="p" id="mwuA">{</span><span class="w" id="mwuQ"> </span>
<span class="w" id="mwug">    </span><span class="k" id="mwuw">if</span><span class="w" id="mwvA"> </span><span class="p" id="mwvQ">(</span><span class="w" id="mwvg"> </span><span class="o" id="mwvw">!</span><span class="w" id="mwwA"> </span><span class="n" id="mwwQ">setjmp</span><span class="p" id="mwwg">(</span><span class="n" id="mwww">buf</span><span class="p" id="mwxA">)</span><span class="w" id="mwxQ"> </span><span class="p" id="mwxg">)</span><span class="w" id="mwxw"> </span><span class="p" id="mwyA">{</span>
<span class="w" id="mwyQ">        </span><span class="n" id="mwyg">first</span><span class="p" id="mwyw">();</span><span class="w" id="mwzA">                </span><span class="c1" id="mwzQ">// Cuando se ejecuta, devuelve 0 setjmp</span>
<span class="w" id="mwzg">    </span><span class="p" id="mwzw">}</span><span class="w" id="mw0A"> </span><span class="k" id="mw0Q">else</span><span class="w" id="mw0g"> </span><span class="p" id="mw0w">{</span><span class="w" id="mw1A">                    </span><span class="c1" id="mw1Q">// cuando salta longjmp, setjmp devuelve 1</span>
<span class="w" id="mw1g">        </span><span class="n" id="mw1w">printf</span><span class="p" id="mw2A">(</span><span class="s" id="mw2Q">"main</span><span class="se" id="mw2g">\n</span><span class="s" id="mw2w">"</span><span class="p" id="mw3A">);</span><span class="w" id="mw3Q">       </span><span class="c1" id="mw3g">// Impresiones</span>
<span class="w" id="mw3w">    </span><span class="p" id="mw4A">}</span>

<span class="w" id="mw4Q">    </span><span class="k" id="mw4g">return</span><span class="w" id="mw4w"> </span><span class="mi" id="mw5A">0</span><span class="p" id="mw5Q">;</span>
<span class="p" id="mw5g">}</span>
</pre></div>

</section><section data-mw-section-id="6" id="mw5w" aria-labelledby="Manejo_de_excepciones"><div class="mw-heading mw-heading3"><h3 id="Manejo_de_excepciones">Manejo de excepciones</h3></div>

<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr" typeof="mw:Extension/syntaxhighlight" id="mw6A"><pre id="mw6Q"><span id="mw6g"></span><span class="cp" id="mw6w">#include</span><span class="w" id="mw7A"> </span><span class="cpf" id="mw7Q">&lt;stdio.h&gt;</span>
<span class="cp" id="mw7g">#include</span><span class="w" id="mw7w"> </span><span class="cpf" id="mw8A">&lt;stdlib.h&gt;</span>
<span class="cp" id="mw8Q">#include</span><span class="w" id="mw8g"> </span><span class="cpf" id="mw8w">&lt;string.h&gt;</span>
<span class="cp" id="mw9A">#include</span><span class="w" id="mw9Q"> </span><span class="cpf" id="mw9g">&lt;setjmp.h&gt;</span>
<span class="w" id="mw9w"> </span>
<span class="kt" id="mw-A">void</span><span class="w" id="mw-Q"> </span><span class="nf" id="mw-g">first</span><span class="p" id="mw-w">(</span><span class="kt" id="mw_A">void</span><span class="p" id="mw_Q">);</span>
<span class="kt" id="mw_g">void</span><span class="w" id="mw_w"> </span><span class="nf" id="mwAQA">second</span><span class="p" id="mwAQE">(</span><span class="kt" id="mwAQI">void</span><span class="p" id="mwAQM">);</span>
<span class="w" id="mwAQQ"> </span>
<span class="cm" id="mwAQU">/* This program's output is:</span>
<span class="cm" id="mwAQY"> </span>
<span class="cm" id="mwAQc">calling first</span>
<span class="cm" id="mwAQg">calling second</span>
<span class="cm" id="mwAQk">entering second</span>
<span class="cm" id="mwAQo">second failed with type 3 exception; remapping to type 1.</span>
<span class="cm" id="mwAQs">first failed, exception type 1</span>
<span class="cm" id="mwAQw"> </span>
<span class="cm" id="mwAQ0">*/</span>
<span class="w" id="mwAQ4"> </span>
<span class="cm" id="mwAQ8">/* Use a file scoped static variable for the exception stack so we can access</span>
<span class="cm" id="mwARA"> * it anywhere within this translation unit. */</span>
<span class="k" id="mwARE">static</span><span class="w" id="mwARI"> </span><span class="kt" id="mwARM">jmp_buf</span><span class="w" id="mwARQ"> </span><span class="n" id="mwARU">exception_env</span><span class="p" id="mwARY">;</span>
<span class="k" id="mwARc">static</span><span class="w" id="mwARg"> </span><span class="kt" id="mwARk">int</span><span class="w" id="mwARo"> </span><span class="n" id="mwARs">exception_type</span><span class="p" id="mwARw">;</span>
<span class="w" id="mwAR0"> </span>
<span class="kt" id="mwAR4">int</span><span class="w" id="mwAR8"> </span><span class="nf" id="mwASA">main</span><span class="p" id="mwASE">()</span><span class="w" id="mwASI"> </span><span class="p" id="mwASM">{</span>
<span class="w" id="mwASQ">    </span><span class="kt" id="mwASU">void</span><span class="w" id="mwASY"> </span><span class="o" id="mwASc">*</span><span class="k" id="mwASg">volatile</span><span class="w" id="mwASk"> </span><span class="n" id="mwASo">mem_buffer</span><span class="p" id="mwASs">;</span>
<span class="w" id="mwASw"> </span>
<span class="w" id="mwAS0">    </span><span class="n" id="mwAS4">mem_buffer</span><span class="w" id="mwAS8"> </span><span class="o" id="mwATA">=</span><span class="w" id="mwATE"> </span><span class="nb" id="mwATI">NULL</span><span class="p" id="mwATM">;</span>
<span class="w" id="mwATQ">    </span><span class="k" id="mwATU">if</span><span class="w" id="mwATY"> </span><span class="p" id="mwATc">(</span><span class="n" id="mwATg">setjmp</span><span class="p" id="mwATk">(</span><span class="n" id="mwATo">exception_env</span><span class="p" id="mwATs">))</span><span class="w" id="mwATw"> </span><span class="p" id="mwAT0">{</span>
<span class="w" id="mwAT4">        </span><span class="cm" id="mwAT8">/* if we get here there was an exception */</span>
<span class="w" id="mwAUA">        </span><span class="n" id="mwAUE">printf</span><span class="p" id="mwAUI">(</span><span class="s" id="mwAUM">"first failed, exception type %d</span><span class="se" id="mwAUQ">\n</span><span class="s" id="mwAUU">"</span><span class="p" id="mwAUY">,</span><span class="w" id="mwAUc"> </span><span class="n" id="mwAUg">exception_type</span><span class="p" id="mwAUk">);</span>
<span class="w" id="mwAUo">    </span><span class="p" id="mwAUs">}</span><span class="w" id="mwAUw"> </span><span class="k" id="mwAU0">else</span><span class="w" id="mwAU4"> </span><span class="p" id="mwAU8">{</span>
<span class="w" id="mwAVA">        </span><span class="cm" id="mwAVE">/* Run code that may signal failure via longjmp. */</span>
<span class="w" id="mwAVI">        </span><span class="n" id="mwAVM">printf</span><span class="p" id="mwAVQ">(</span><span class="s" id="mwAVU">"calling first</span><span class="se" id="mwAVY">\n</span><span class="s" id="mwAVc">"</span><span class="p" id="mwAVg">);</span>
<span class="w" id="mwAVk">        </span><span class="n" id="mwAVo">first</span><span class="p" id="mwAVs">();</span>
<span class="w" id="mwAVw">        </span><span class="n" id="mwAV0">mem_buffer</span><span class="w" id="mwAV4"> </span><span class="o" id="mwAV8">=</span><span class="w" id="mwAWA"> </span><span class="n" id="mwAWE">malloc</span><span class="p" id="mwAWI">(</span><span class="mi" id="mwAWM">300</span><span class="p" id="mwAWQ">);</span><span class="w" id="mwAWU"> </span><span class="cm" id="mwAWY">/* allocate a resource */</span>
<span class="w" id="mwAWc">        </span><span class="n" id="mwAWg">printf</span><span class="p" id="mwAWk">(</span><span class="n" id="mwAWo">strcpy</span><span class="p" id="mwAWs">((</span><span class="kt" id="mwAWw">char</span><span class="o" id="mwAW0">*</span><span class="p" id="mwAW4">)</span><span class="w" id="mwAW8"> </span><span class="n" id="mwAXA">mem_buffer</span><span class="p" id="mwAXE">,</span><span class="w" id="mwAXI"> </span><span class="s" id="mwAXM">"first succeeded!"</span><span class="p" id="mwAXQ">));</span><span class="w" id="mwAXU"> </span><span class="cm" id="mwAXY">/* ... this will not happen */</span>
<span class="w" id="mwAXc">    </span><span class="p" id="mwAXg">}</span>
<span class="w" id="mwAXk">    </span><span class="k" id="mwAXo">if</span><span class="w" id="mwAXs"> </span><span class="p" id="mwAXw">(</span><span class="n" id="mwAX0">mem_buffer</span><span class="p" id="mwAX4">)</span>
<span class="w" id="mwAX8">        </span><span class="n" id="mwAYA">free</span><span class="p" id="mwAYE">((</span><span class="kt" id="mwAYI">void</span><span class="o" id="mwAYM">*</span><span class="p" id="mwAYQ">)</span><span class="w" id="mwAYU"> </span><span class="n" id="mwAYY">mem_buffer</span><span class="p" id="mwAYc">);</span><span class="w" id="mwAYg"> </span><span class="cm" id="mwAYk">/* carefully deallocate resource */</span>
<span class="w" id="mwAYo">    </span><span class="k" id="mwAYs">return</span><span class="w" id="mwAYw"> </span><span class="mi" id="mwAY0">0</span><span class="p" id="mwAY4">;</span>
<span class="p" id="mwAY8">}</span>
<span class="w" id="mwAZA"> </span>
<span class="kt" id="mwAZE">void</span><span class="w" id="mwAZI"> </span><span class="nf" id="mwAZM">first</span><span class="p" id="mwAZQ">(</span><span class="kt" id="mwAZU">void</span><span class="p" id="mwAZY">)</span><span class="w" id="mwAZc"> </span><span class="p" id="mwAZg">{</span>
<span class="w" id="mwAZk">    </span><span class="kt" id="mwAZo">jmp_buf</span><span class="w" id="mwAZs"> </span><span class="n" id="mwAZw">my_env</span><span class="p" id="mwAZ0">;</span>
<span class="w" id="mwAZ4"> </span>
<span class="w" id="mwAZ8">    </span><span class="n" id="mwAaA">printf</span><span class="p" id="mwAaE">(</span><span class="s" id="mwAaI">"calling second</span><span class="se" id="mwAaM">\n</span><span class="s" id="mwAaQ">"</span><span class="p" id="mwAaU">);</span>
<span class="w" id="mwAaY">    </span><span class="n" id="mwAac">memcpy</span><span class="p" id="mwAag">(</span><span class="n" id="mwAak">my_env</span><span class="p" id="mwAao">,</span><span class="w" id="mwAas"> </span><span class="n" id="mwAaw">exception_env</span><span class="p" id="mwAa0">,</span><span class="w" id="mwAa4"> </span><span class="k" id="mwAa8">sizeof</span><span class="p" id="mwAbA">(</span><span class="kt" id="mwAbE">jmp_buf</span><span class="p" id="mwAbI">));</span>
<span class="w" id="mwAbM">    </span><span class="k" id="mwAbQ">switch</span><span class="w" id="mwAbU"> </span><span class="p" id="mwAbY">(</span><span class="n" id="mwAbc">setjmp</span><span class="p" id="mwAbg">(</span><span class="n" id="mwAbk">exception_env</span><span class="p" id="mwAbo">))</span><span class="w" id="mwAbs"> </span><span class="p" id="mwAbw">{</span>
<span class="w" id="mwAb0">        </span><span class="k" id="mwAb4">case</span><span class="w" id="mwAb8"> </span><span class="mi" id="mwAcA">3</span><span class="p" id="mwAcE">:</span>
<span class="w" id="mwAcI">            </span><span class="cm" id="mwAcM">/* if we get here there was an exception. */</span>
<span class="w" id="mwAcQ">            </span><span class="n" id="mwAcU">printf</span><span class="p" id="mwAcY">(</span><span class="s" id="mwAcc">"second failed with type 3 exception; remapping to type 1.</span><span class="se" id="mwAcg">\n</span><span class="s" id="mwAck">"</span><span class="p" id="mwAco">);</span>
<span class="w" id="mwAcs">            </span><span class="n" id="mwAcw">exception_type</span><span class="w" id="mwAc0"> </span><span class="o" id="mwAc4">=</span><span class="w" id="mwAc8"> </span><span class="mi" id="mwAdA">1</span><span class="p" id="mwAdE">;</span>

<span class="w" id="mwAdI">        </span><span class="k" id="mwAdM">default</span><span class="o" id="mwAdQ">:</span><span class="w" id="mwAdU"> </span><span class="cm" id="mwAdY">/* fall through */</span>
<span class="w" id="mwAdc">            </span><span class="n" id="mwAdg">memcpy</span><span class="p" id="mwAdk">(</span><span class="n" id="mwAdo">exception_env</span><span class="p" id="mwAds">,</span><span class="w" id="mwAdw"> </span><span class="n" id="mwAd0">my_env</span><span class="p" id="mwAd4">,</span><span class="w" id="mwAd8"> </span><span class="k" id="mwAeA">sizeof</span><span class="p" id="mwAeE">(</span><span class="kt" id="mwAeI">jmp_buf</span><span class="p" id="mwAeM">));</span><span class="w" id="mwAeQ"> </span><span class="cm" id="mwAeU">/* restore exception stack */</span>
<span class="w" id="mwAeY">            </span><span class="n" id="mwAec">longjmp</span><span class="p" id="mwAeg">(</span><span class="n" id="mwAek">exception_env</span><span class="p" id="mwAeo">,</span><span class="w" id="mwAes"> </span><span class="n" id="mwAew">exception_type</span><span class="p" id="mwAe0">);</span><span class="w" id="mwAe4"> </span><span class="cm" id="mwAe8">/* continue handling the exception */</span>

<span class="w" id="mwAfA">        </span><span class="k" id="mwAfE">case</span><span class="w" id="mwAfI"> </span><span class="mi" id="mwAfM">0</span><span class="p" id="mwAfQ">:</span>
<span class="w" id="mwAfU">            </span><span class="cm" id="mwAfY">/* normal, desired operation */</span>
<span class="w" id="mwAfc">            </span><span class="n" id="mwAfg">second</span><span class="p" id="mwAfk">();</span>
<span class="w" id="mwAfo">            </span><span class="n" id="mwAfs">printf</span><span class="p" id="mwAfw">(</span><span class="s" id="mwAf0">"second succeeded</span><span class="se" id="mwAf4">\n</span><span class="s" id="mwAf8">"</span><span class="p" id="mwAgA">);</span><span class="w" id="mwAgE">  </span><span class="cm" id="mwAgI">/* not reached */</span>
<span class="w" id="mwAgM">    </span><span class="p" id="mwAgQ">}</span>
<span class="w" id="mwAgU">    </span><span class="n" id="mwAgY">memcpy</span><span class="p" id="mwAgc">(</span><span class="n" id="mwAgg">exception_env</span><span class="p" id="mwAgk">,</span><span class="w" id="mwAgo"> </span><span class="n" id="mwAgs">my_env</span><span class="p" id="mwAgw">,</span><span class="w" id="mwAg0"> </span><span class="k" id="mwAg4">sizeof</span><span class="p" id="mwAg8">(</span><span class="kt" id="mwAhA">jmp_buf</span><span class="p" id="mwAhE">));</span><span class="w" id="mwAhI"> </span><span class="cm" id="mwAhM">/* restore exception stack */</span>
<span class="p" id="mwAhQ">}</span>
<span class="w" id="mwAhU"> </span>
<span class="kt" id="mwAhY">void</span><span class="w" id="mwAhc"> </span><span class="nf" id="mwAhg">second</span><span class="p" id="mwAhk">(</span><span class="kt" id="mwAho">void</span><span class="p" id="mwAhs">)</span><span class="w" id="mwAhw"> </span><span class="p" id="mwAh0">{</span>
<span class="w" id="mwAh4">    </span><span class="n" id="mwAh8">printf</span><span class="p" id="mwAiA">(</span><span class="s" id="mwAiE">"entering second</span><span class="se" id="mwAiI">\n</span><span class="s" id="mwAiM">"</span><span class="w" id="mwAiQ"> </span><span class="p" id="mwAiU">);</span><span class="w" id="mwAiY"> </span><span class="cm" id="mwAic">/* reached */</span>
<span class="w" id="mwAig">    </span><span class="n" id="mwAik">exception_type</span><span class="w" id="mwAio"> </span><span class="o" id="mwAis">=</span><span class="w" id="mwAiw"> </span><span class="mi" id="mwAi0">3</span><span class="p" id="mwAi4">;</span>
<span class="w" id="mwAi8">    </span><span class="n" id="mwAjA">longjmp</span><span class="p" id="mwAjE">(</span><span class="n" id="mwAjI">exception_env</span><span class="p" id="mwAjM">,</span><span class="w" id="mwAjQ"> </span><span class="n" id="mwAjU">exception_type</span><span class="p" id="mwAjY">);</span><span class="w" id="mwAjc"> </span><span class="cm" id="mwAjg">/* declare that the program has failed */</span>
<span class="w" id="mwAjk">    </span><span class="n" id="mwAjo">printf</span><span class="p" id="mwAjs">(</span><span class="s" id="mwAjw">"leaving second</span><span class="se" id="mwAj0">\n</span><span class="s" id="mwAj4">"</span><span class="p" id="mwAj8">);</span><span class="w" id="mwAkA"> </span><span class="cm" id="mwAkE">/* not reached */</span>
<span class="p" id="mwAkI">}</span>
</pre></div>

</section><section data-mw-section-id="7" id="mwAkM" aria-labelledby="Multitarea_cooperativa"><div class="mw-heading mw-heading3"><h3 id="Multitarea_cooperativa">Multitarea cooperativa</h3></div>

<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr" typeof="mw:Extension/syntaxhighlight" id="mwAkQ"><pre id="mwAkU"><span id="mwAkY"></span><span class="cp" id="mwAkc">#include</span><span class="w" id="mwAkg"> </span><span class="cpf" id="mwAkk">&lt;setjmp.h&gt;</span>
<span class="cp" id="mwAko">#include</span><span class="w" id="mwAks"> </span><span class="cpf" id="mwAkw">&lt;stdio.h&gt;</span>

<span class="kt" id="mwAk0">jmp_buf</span><span class="w" id="mwAk4"> </span><span class="n" id="mwAk8">mainTask</span><span class="p" id="mwAlA">,</span><span class="w" id="mwAlE"> </span><span class="n" id="mwAlI">childTask</span><span class="p" id="mwAlM">;</span>

<span class="kt" id="mwAlQ">void</span><span class="w" id="mwAlU"> </span><span class="nf" id="mwAlY">call_with_cushion</span><span class="p" id="mwAlc">(</span><span class="kt" id="mwAlg">void</span><span class="p" id="mwAlk">);</span>
<span class="kt" id="mwAlo">void</span><span class="w" id="mwAls"> </span><span class="nf" id="mwAlw">child</span><span class="p" id="mwAl0">(</span><span class="kt" id="mwAl4">void</span><span class="p" id="mwAl8">);</span>

<span class="kt" id="mwAmA">int</span><span class="w" id="mwAmE"> </span><span class="nf" id="mwAmI">main</span><span class="p" id="mwAmM">(</span><span class="kt" id="mwAmQ">void</span><span class="p" id="mwAmU">)</span><span class="w" id="mwAmY"> </span><span class="p" id="mwAmc">{</span>
<span class="w" id="mwAmg">    </span><span class="k" id="mwAmk">if</span><span class="w" id="mwAmo"> </span><span class="p" id="mwAms">(</span><span class="o" id="mwAmw">!</span><span class="n" id="mwAm0">setjmp</span><span class="p" id="mwAm4">(</span><span class="n" id="mwAm8">mainTask</span><span class="p" id="mwAnA">))</span><span class="w" id="mwAnE"> </span><span class="p" id="mwAnI">{</span>
<span class="w" id="mwAnM">        </span><span class="n" id="mwAnQ">call_with_cushion</span><span class="p" id="mwAnU">();</span><span class="w" id="mwAnY"> </span><span class="cm" id="mwAnc">/* child never returns */</span><span class="w" id="mwAng"> </span><span class="cm" id="mwAnk">/* yield */</span>
<span class="w" id="mwAno">    </span><span class="p" id="mwAns">}</span><span class="w" id="mwAnw"> </span><span class="cm" id="mwAn0">/* execution resumes after this "}" after first time that child yields */</span>
<span class="w" id="mwAn4">    </span><span class="k" id="mwAn8">for</span><span class="w" id="mwAoA"> </span><span class="p" id="mwAoE">(;;)</span><span class="w" id="mwAoI"> </span><span class="p" id="mwAoM">{</span>
<span class="w" id="mwAoQ">        </span><span class="n" id="mwAoU">printf</span><span class="p" id="mwAoY">(</span><span class="s" id="mwAoc">"Parent</span><span class="se" id="mwAog">\n</span><span class="s" id="mwAok">"</span><span class="p" id="mwAoo">);</span>
<span class="w" id="mwAos">        </span><span class="k" id="mwAow">if</span><span class="w" id="mwAo0"> </span><span class="p" id="mwAo4">(</span><span class="o" id="mwAo8">!</span><span class="n" id="mwApA">setjmp</span><span class="p" id="mwApE">(</span><span class="n" id="mwApI">mainTask</span><span class="p" id="mwApM">))</span><span class="w" id="mwApQ"> </span><span class="p" id="mwApU">{</span>
<span class="w" id="mwApY">            </span><span class="n" id="mwApc">longjmp</span><span class="p" id="mwApg">(</span><span class="n" id="mwApk">childTask</span><span class="p" id="mwApo">,</span><span class="w" id="mwAps"> </span><span class="mi" id="mwApw">1</span><span class="p" id="mwAp0">);</span><span class="w" id="mwAp4"> </span><span class="cm" id="mwAp8">/* yield - note that this is undefined under C99 */</span>
<span class="w" id="mwAqA">        </span><span class="p" id="mwAqE">}</span>
<span class="w" id="mwAqI">    </span><span class="p" id="mwAqM">}</span>
<span class="p" id="mwAqQ">}</span>

<span class="kt" id="mwAqU">void</span><span class="w" id="mwAqY"> </span><span class="nf" id="mwAqc">call_with_cushion</span><span class="w" id="mwAqg"> </span><span class="p" id="mwAqk">(</span><span class="kt" id="mwAqo">void</span><span class="p" id="mwAqs">)</span><span class="w" id="mwAqw"> </span><span class="p" id="mwAq0">{</span>
<span class="w" id="mwAq4">    </span><span class="kt" id="mwAq8">char</span><span class="w" id="mwArA"> </span><span class="n" id="mwArE">space</span><span class="p" id="mwArI">[</span><span class="mi" id="mwArM">1000</span><span class="p" id="mwArQ">];</span><span class="w" id="mwArU"> </span><span class="cm" id="mwArY">/* Reserve enough space for main to run */</span>
<span class="w" id="mwArc">    </span><span class="n" id="mwArg">space</span><span class="p" id="mwArk">[</span><span class="mi" id="mwAro">999</span><span class="p" id="mwArs">]</span><span class="w" id="mwArw"> </span><span class="o" id="mwAr0">=</span><span class="w" id="mwAr4"> </span><span class="mi" id="mwAr8">1</span><span class="p" id="mwAsA">;</span><span class="w" id="mwAsE"> </span><span class="cm" id="mwAsI">/* Do not optimize array out of existence */</span>
<span class="w" id="mwAsM">    </span><span class="n" id="mwAsQ">child</span><span class="p" id="mwAsU">();</span>
<span class="p" id="mwAsY">}</span>

<span class="kt" id="mwAsc">void</span><span class="w" id="mwAsg"> </span><span class="nf" id="mwAsk">child</span><span class="w" id="mwAso"> </span><span class="p" id="mwAss">(</span><span class="kt" id="mwAsw">void</span><span class="p" id="mwAs0">)</span><span class="w" id="mwAs4"> </span><span class="p" id="mwAs8">{</span>
<span class="w" id="mwAtA">    </span><span class="k" id="mwAtE">for</span><span class="w" id="mwAtI"> </span><span class="p" id="mwAtM">(;;)</span><span class="w" id="mwAtQ"> </span><span class="p" id="mwAtU">{</span>
<span class="w" id="mwAtY">        </span><span class="n" id="mwAtc">printf</span><span class="p" id="mwAtg">(</span><span class="s" id="mwAtk">"Child loop begin</span><span class="se" id="mwAto">\n</span><span class="s" id="mwAts">"</span><span class="p" id="mwAtw">);</span>
<span class="w" id="mwAt0">        </span><span class="k" id="mwAt4">if</span><span class="w" id="mwAt8"> </span><span class="p" id="mwAuA">(</span><span class="o" id="mwAuE">!</span><span class="n" id="mwAuI">setjmp</span><span class="p" id="mwAuM">(</span><span class="n" id="mwAuQ">childTask</span><span class="p" id="mwAuU">))</span><span class="w" id="mwAuY"> </span><span class="n" id="mwAuc">longjmp</span><span class="p" id="mwAug">(</span><span class="n" id="mwAuk">mainTask</span><span class="p" id="mwAuo">,</span><span class="w" id="mwAus"> </span><span class="mi" id="mwAuw">1</span><span class="p" id="mwAu0">);</span><span class="w" id="mwAu4"> </span><span class="cm" id="mwAu8">/* yield - invalidates childTask in C99 */</span>

<span class="w" id="mwAvA">        </span><span class="n" id="mwAvE">printf</span><span class="p" id="mwAvI">(</span><span class="s" id="mwAvM">"Child loop end</span><span class="se" id="mwAvQ">\n</span><span class="s" id="mwAvU">"</span><span class="p" id="mwAvY">);</span>
<span class="w" id="mwAvc">        </span><span class="k" id="mwAvg">if</span><span class="w" id="mwAvk"> </span><span class="p" id="mwAvo">(</span><span class="o" id="mwAvs">!</span><span class="n" id="mwAvw">setjmp</span><span class="p" id="mwAv0">(</span><span class="n" id="mwAv4">childTask</span><span class="p" id="mwAv8">))</span><span class="w" id="mwAwA"> </span><span class="n" id="mwAwE">longjmp</span><span class="p" id="mwAwI">(</span><span class="n" id="mwAwM">mainTask</span><span class="p" id="mwAwQ">,</span><span class="w" id="mwAwU"> </span><span class="mi" id="mwAwY">1</span><span class="p" id="mwAwc">);</span><span class="w" id="mwAwg"> </span><span class="cm" id="mwAwk">/* yield - invalidates childTask in C99 */</span>
<span class="w" id="mwAwo">    </span><span class="p" id="mwAws">}</span>
<span class="w" id="mwAww">    </span><span class="cm" id="mwAw0">/* Don't return. Instead we should set a flag to indicate that main()</span>
<span class="cm" id="mwAw4">       should stop yielding to us and then longjmp(mainTask, 1) */</span>
<span class="p" id="mwAw8">}</span>
</pre></div>

</section></section><section data-mw-section-id="8" id="mwAxA" aria-labelledby="Referencias"><div class="mw-heading mw-heading2"><h2 id="Referencias">Referencias</h2></div>
<div class="listaref" style=" list-style-type: decimal;" typeof="mw:Transclusion" id="mwAxE"><ol class="mw-references references" typeof="mw:Extension/references" id="mwAxI"><li id="cite_note-macro-1" data-mw-footnote-number="1"><span rel="mw:referencedBy" class="mw-cite-backlink" id="mwAxM"><a href="#cite_ref-macro_1-0" id="mwAxQ"><span class="mw-linkback-text" id="mwAxU">1</span></a> <a href="#cite_ref-macro_1-1" id="mwAxY"><span class="mw-linkback-text" id="mwAxc">2</span></a></span> <span id="mw-reference-text-cite_note-macro-1" class="mw-reference-text reference-text">ISO C establece que <code id="mwAxg">setjmp</code> debe ser implementado como una macro, pero POSIX establece explícitamente que no está definido si <code id="mwAxk">setjmp</code> es una macro o una función.</span></li>
<li id="cite_note-2" data-mw-footnote-number="2"><span class="mw-cite-backlink" id="mwAxo"><a href="#cite_ref-2" rel="mw:referencedBy" id="mwAxs"><span class="mw-linkback-text" id="mwAxw">↑</span></a></span> <span id="mw-reference-text-cite_note-2" class="mw-reference-text reference-text">Este es el tipo usado por <a rel="mw:WikiLink" href="Glibc" title="Glibc" id="mwAx0">Glibc</a>, versión 2.7</span></li>
<li id="cite_note-3" data-mw-footnote-number="3"><span class="mw-cite-backlink" id="mwAx4"><a href="#cite_ref-3" rel="mw:referencedBy" id="mwAx8"><span class="mw-linkback-text" id="mwAyA">↑</span></a></span> <span id="mw-reference-text-cite_note-3" class="mw-reference-text reference-text"><a rel="mw:ExtLink nofollow" href="http://www.cs.utk.edu/~mbeck/classes/cs560/360/notes/Setjmp/lecture.html" class="external text" id="mwAyE">CS360 Lecture Notes — Setjmp and Longjmp</a></span></li>
<li id="cite_note-4" data-mw-footnote-number="4"><span class="mw-cite-backlink" id="mwAyI"><a href="#cite_ref-4" rel="mw:referencedBy" id="mwAyM"><span class="mw-linkback-text" id="mwAyQ">↑</span></a></span> <span id="mw-reference-text-cite_note-4" class="mw-reference-text reference-text"><a rel="mw:ExtLink nofollow" href="http://www.uwm.edu/cgi-bin/IMT/wwwman?topic=setjmp(3)&amp;msection=" class="external text" id="mwAyU">setjmp(3)</a> <a rel="mw:ExtLink nofollow" href="https://web.archive.org/web/20090726081425/http://www.uwm.edu/cgi-bin/IMT/wwwman?topic=setjmp(3)&amp;msection=" typeof="mw:Transclusion" class="external text" id="mwAyY">Archivado</a><span id="mwAyc"> el 26 de julio de 2009 en </span><a rel="mw:WikiLink" href="Wayback_Machine" title="Wayback Machine" id="mwAyg">Wayback Machine</a><span id="mwAyk">.</span></span></li>
<li id="cite_note-ISO/IEC_9899:1999-5" data-mw-footnote-number="5"><span class="mw-cite-backlink" id="mwAyo"><a href="#cite_ref-ISO/IEC_9899:1999_5-0" rel="mw:referencedBy" id="mwAys"><span class="mw-linkback-text" id="mwAyw">↑</span></a></span> <span id="mw-reference-text-cite_note-ISO/IEC_9899:1999-5" class="mw-reference-text reference-text"><a rel="mw:ExtLink nofollow" href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf" class="external text" id="mwAy0">ISO/IEC 9899:1999</a>, 2005, 7.13.2.1:2 y nota al pie 211</span></li>
</ol></div>

</section><section data-mw-section-id="9" id="mwAy4" aria-labelledby="Enlaces_externos"><div class="mw-heading mw-heading2"><h2 id="Enlaces_externos">Enlaces externos</h2></div>
<ul id="mwAy8"><li id="mwAzA"><a rel="mw:ExtLink nofollow" href="http://manpages.debian.net/cgi-bin/man.cgi?query=setjmp&amp;sektion=3&amp;locale=es" typeof="mw:Transclusion" class="external text" id="mwAzE">setjmp(3)</a><span typeof="mw:Entity">:</span><span typeof="mw:Entity">&nbsp;</span><span>save stack context for non-local goto</span><span typeof="mw:Entity">&nbsp;</span><span>–</span><span typeof="mw:Entity">&nbsp;</span><span>Subrutinas en el </span><a rel="mw:WikiLink" href="Man_(Unix)" title="Man (Unix)">Manual</a><span> de </span><a rel="mw:WikiLink" href="Debian" title="Debian" class="mw-redirect" id="mwAzI">Debian</a></li>
<li id="mwAzM"><a rel="mw:ExtLink nofollow" href="http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html" class="external text" id="mwAzQ">Exceptions in C with Longjmp and Setjmp</a></li></ul>

<span class="mw-empty-elt" typeof="mw:Transclusion" id="mwAzU"><style data-mw-deduplicate="TemplateStyles:r161257576" typeof="mw:Extension/templatestyles">
/* start https://es.wikipedia.org/ */


.mw-parser-output .mw-authority-control{margin-top:1.5em}.mw-parser-output .mw-authority-control .navbox table{margin:0}.mw-parser-output .mw-authority-control .navbox hr:last-child{display:none}.mw-parser-output .mw-authority-control .navbox+.mw-mf-linked-projects{display:none}.mw-parser-output .mw-authority-control .mw-mf-linked-projects{display:flex;padding:0.5em;border:1px solid var(--border-color-base,#a2a9b1);background-color:var(--background-color-neutral,#eaecf0);color:var(--color-base,#202122)}.mw-parser-output .mw-authority-control .mw-mf-linked-projects ul li{margin-bottom:0}.mw-parser-output .mw-authority-control .navbox{border:1px solid var(--border-color-base,#a2a9b1);background-color:var(--background-color-neutral-subtle,#f8f9fa)}.mw-parser-output .mw-authority-control .navbox-list{border-color:#f8f9fa}.mw-parser-output .mw-authority-control .navbox th{background-color:#eeeeff}html.skin-theme-clientpref-night .mw-parser-output .mw-authority-control .mw-mf-linked-projects{border:1px solid var(--border-color-base,#72777d);background-color:var(--background-color-neutral,#27292d);color:var(--color-base,#eaecf0)}html.skin-theme-clientpref-night .mw-parser-output .mw-authority-control .navbox{border:1px solid var(--border-color-base,#72777d)!important;background-color:var(--background-color-neutral-subtle,#202122)!important}html.skin-theme-clientpref-night .mw-parser-output .mw-authority-control .navbox-list{border-color:#202122!important}html.skin-theme-clientpref-night .mw-parser-output .mw-authority-control .navbox th{background-color:#27292d!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .mw-authority-control .mw-mf-linked-projects{border:1px solid var(--border-color-base,#72777d)!important;background-color:var(--background-color-neutral,#27292d)!important;color:var(--color-base,#eaecf0)!important}html.skin-theme-clientpref-os .mw-parser-output .mw-authority-control .navbox{border:1px solid var(--border-color-base,#72777d)!important;background-color:var(--background-color-neutral-subtle,#202122)!important}html.skin-theme-clientpref-os .mw-parser-output .mw-authority-control .navbox-list{border-color:#202122!important}html.skin-theme-clientpref-os .mw-parser-output .mw-authority-control .navbox th{background-color:#27292d!important}}


/* end   https://es.wikipedia.org/ */
</style></span><div class="mw-authority-control" id="mwAzY"><div role="navigation" class="navbox" aria-label="Navbox" style="width: inherit;padding:3px"><table class="hlist navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="row" class="navbox-group" style="width: 12%; text-align:center;"><a rel="mw:WikiLink" href="Control_de_autoridades" title="Control de autoridades">Control de autoridades</a></th><td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px"><div style="padding:0em 0.25em">
<ul><li><b>Proyectos Wikimedia</b></li>
<li><span style="white-space:nowrap;"><span typeof="mw:File"><a href="Wikidata" title="Wikidata"><img alt="Wd" src="./_assets_/0c70a452f799bfe840676ee341124611/Wikidata-logo.svg.png" decoding="async" data-file-width="1050" data-file-height="590" data-file-type="drawing" height="11" width="20" class="mw-file-element" loading="lazy"></a></span> Datos:</span> <span class="uid"><a rel="mw:WikiLink/Interwiki" href="https://www.wikidata.org/wiki/Q307160" title="wikidata:Q307160" class="extiw external">Q307160</a></span></li></ul>

</div></td></tr></tbody></table></div><div class="mw-mf-linked-projects hlist">
<ul><li><span style="white-space:nowrap;"><span typeof="mw:File"><a href="Wikidata" title="Wikidata"><img alt="Wd" src="./_assets_/0c70a452f799bfe840676ee341124611/Wikidata-logo.svg.png" decoding="async" data-file-width="1050" data-file-height="590" data-file-type="drawing" height="11" width="20" class="mw-file-element" loading="lazy"></a></span> Datos:</span> <span class="uid"><a rel="mw:WikiLink/Interwiki" href="https://www.wikidata.org/wiki/Q307160" title="wikidata:Q307160" class="extiw external">Q307160</a></span></li></ul>
</div></div>
</section></div><!--htdig_noindex--><div><div class="zim-footer">
    Este artículo ha sido escrito por <a class="external text" title="Esta página se editó por última vez el 2025-02-03" href="https://es.wikipedia.org/wiki/?title=Setjmp.h&amp;oldid=165171086">Wikipedia</a>. El texto está disponible bajo la licencia <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.es">Creative Commons Attribution-Share Alike 4.0</a>. Pueden aplicarse cláusulas adicionales a los archivos multimedia.
</div>
</div><!--/htdig_noindex--></div>
            </div>
          </main>
        </div>
      </div>
    </div>
     <script src="./_webp_/webpHandler.js"></script>
  

</body></html>